redis-对象

redis支持5中数据结构,分别是字符串、列表、集合、有序集合以及哈希表。在不同的场景使用合适的数据结构,会节省很多精力。

redis的对象结构如下

1
2
3
4
5
6
7
typedef struct redisObject {
unsigned type:4; //数据类型
unsigned encoding:4; //编码方式
unsigned lru:LRU_BITS; //lru time or lfu data
int refcount; //引用计数
void *ptr; //数据内容
} robj;

根据type取值不同分为以下5种类型:

OBJ_STRING 字符串
OBJ_LIST 列表
OBJ_SET 结合
OBJ_ZSET 有序集合
OBJ_HASH 哈希表

encoding取值如下:
OBJ_ENCODING_RAW //原始数据
OBJ_ENCODING_INT //整数
OBJ_ENCODING_HT //哈希表
OBJ_ENCODING_ZIPMAP //压缩图
OBJ_ENCODING_LINKEDLIST //链表,以前list的编码形式,现在不用了
OBJ_ENCODING_ZIPLIST //压缩列表
OBJ_ENCODING_INTSET //整形集合
OBJ_ENCODING_SKIPLIST //跳跃表
OBJ_ENCODING_EMBSTR //压缩字符串
OBJ_ENCODING_QUICKLIST //链式的压缩列表
OBJ_ENCODING_STREAM //基数树

总的来说,redis支持五种数据结构,但每种数据结构的实现方式有多种,比如集合可以用数组和哈希表实现,列表可以用压缩列表、快速列表实现

整数集合

数据结构
1
2
3
4
5
typedef struct intset {
uint32_t encoding; //编码类型
uint32_t length; //集合内元素的数量
int8_t contents[]; //集合数据
} intset;