Redis是个key-value形式的,其中key只能是String类型,而value的数据结构有:String、List、Hash、Set、Zset等
1.String
1.1 底层实现(Simple Dynamic String)
sds结构体
struct __atribute__ ((__packed__)) sdshdr8{
uint8_t len;
uint8_t alloc;
unsigned char flags;
char buf[];
}
Redis还定义了sdshr16、sdshr32、sdshr64结构体,其中sdshr8就等于说可以存放字符串小于256(2^8),以此类推,Redis字符串最多可以存储512MB
1.2 具体应用
缓存HTML片段、记录用户登录信息
2.List
2.1 底层实现(双向链表、压缩链表)
双向链表
typedef struct listNode{
struct listNode *prev;
struct listNode *next;
void *value;
}
typedef struct list{
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);
unsigned long len;
}list;
优点:可以用O(1)时间复杂度完成列表的头部或者尾部的插入和删除。
缺点:不能随机存取
压缩列表
总体布局
<zlbytes> <zltail>> <zllen> <entry> <entry> ... <entry> <zlend>
2.2 具体应用
消息队列
3.Hash
3.1 底层实现(哈希表、压缩列表)
哈希表
typdef struct dictEntry{
void *key;
union{
void *val;
uint64_t u64;
int64_t s64;
double d;
}v;
stuct dictEntry *next;
}dictEntry;
typedef struct dictht{
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
}dictht;
3.2 具体应用
缓存数据库对象
4.Set
4.1 底层实现(整数集合 + 哈希表)
整数集合
typedef stuct intset{
uint32_t encoding;
uint32_t length;
int8_t contents[];
}intset;
4.2 具体应用
抽奖系统、公共好友列表
5.Zset
5.1 底层实现(跳表、压缩列表)
跳表
typedef struct zskiplistNode{
sds ele;
double score;
struct zskiplistNode *backward;
sturct zskiplistLevel{
struct zskiplistNode *forward;
unsigned long span;
}level[];
}
typedef struct zskiplist{
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
}zskiplist;
5.2 具体应用
排行榜