Redis内部存储结构
Redis内部的存储结构是一个大的hashmap,内部是数组实现的hash,key冲突通过挂链表去实现,每个dictEntry为一个key/value对象,value为定义的redisObject.
结构图如下:
dictEntry的结构体如下:
/*
* 字典
*/
typedef struct dictEntry {
// 键
void *key;
// 值
union {
// 指向具体redisObject
void *val;
//
uint64_t u64;
int64_t s64;
} v;
// 指向下个哈希表节点,形成链表
struct dictEntry *next;
} dictEntry;
- redisObject的内部结构
/*
* Redis 对象
*/
typedef struct redisObject {
// 类型 4bits
unsigned type:4;
// 编码方式 4bits
unsigned encoding:4;
// LRU 时间(相对于 server.lruclock) 24bits
unsigned lru:22;
// 引用计数 Redis里面的数据
// 可以通过引用计数进行共享 32bits
int refcount;
// 指向对象的值 64-bit
void *ptr;
} robj;
*ptr指向具体的数据结构的地址;type表示该对象的类型,即String,List,Hash,Set,Zset中的一个,但为了提高存储效率与程序执行效率,每种对象的底层数据结构都可能不止一种,encoding表示对象底层所使用的编码.
Redis对象底层的八种数据结构
1 REDIS_ENCODING_INT (long类型的整数)
2 REDIS_ENCODING_EMBSTR embstr (编码的简单动态字符串)
3 REDIS_ENCODING_RAW (简单动态字符串)
4 REDIS_ENCODING_HT (字典)
5 REDIS_ENCODING_LINKEDLIST (双端链表)
6 REDIS_ENCODING_ZIPLIST (压缩列表)
7 REDIS_ENCODING_INTSE (整数集合)
8 REDIS_ENCODING_SKIPLIST (跳跃表和字典)
以下是每种数据类型使用的数据结构