1. 简言
redis中使用对象来表示数据库中的键和值
每当我们在redis的数据库中新建立一个键值对时,redis会至少创建两个对象,一个对象用作键,一个对象用作值,其中键的对象一定是字符串对象,值的对象是字符串,列表,哈希,集合,有序集合中的一种
2. 实现
redis中每个对象都由一个redisObject的结构表示
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层实现数据结构的指针
void* ptr;
// ...
} robj;
3. type属性
type属性记录了对象的类型,这个属性的值对应如下表
类型常量 | 对象的名称 | TYPE命令的返回值 |
REDIS_STRING | 字符串对象 | string |
REDIS_LIST | 列表对象 | list |
REDIS_HASH | 哈希对象 | hash |
REDIS_SET | 集合对象 | set |
REDIS_ZSET | 有序集合对象 | zset |
备注:当我们对一个数据库键执行TYPE命令时,会返回数据库键对应的值对象的类型
例子:
redis> SET msg "hello world"
OK
redis> TYPE msg
string
redis> HMSET profile name Tom age 25 career Programmer
OK
redis> TYPE profile
hash
4. encoding属性
encoding属性记录了对象所使用的的编码,也就是说这个对象使用了什么数据结构作为对象的底层实现
这个属性的值对应如下表
编码常量 | 编码所对应的的底层数据结构 | OBJECT EN CODING 命令的返回 |
REDIS_ENCODING_INT | long类型的整数 | int |
REDIS_ENCODING_EMBSTR | embstr编码的字符串 | embstr |
REDIS_ENCODING_RAW | 简单动态字符串 | raw |
REDIS_ENCODING_HT | 字典 | hashtable |
REDIS_ENCODING_LINKEDLIST | 双端列表 | linkedlist |
REDIS_ENCODING_ZIPLIST | 压缩列表 | ziplist |
REDIS_ENCODING_INTSET | 整数集合 | intset |
REDIS_ENCODING_SKIPLIST | 跳跃表 + 字典 | skiplist |
备注:当我们对一个数据库键执行OBJECT ENCODING命令时,会返回数据库键对应的值对象的类型
例子:
redis> SET msg "hello world"
OK
redis> OBJECT ENCODING msg
embstr
redis> SET story "long long long long long long long long long long long long long..."
OK
redis> OBJECT ENCODING story
raw
5. type属性和encoding属性的对应关系
类型(type属性) | 编码(encoding属性) | 注释 |
REDIS_STRING | REDIS_ENCODING_INT | 整数值实现的字符串(是整数时则使用long表示) |
REDIS_STRING | REDIS_ENCODING_EMBSTR | embstr编码的简单动态字符串实现的字符串(字符串长度小于等于32字节时) |
REDIS_STRING | REDIS_ENCODING_RAW | 简单动态字符串实现的字符串(字符串长度大于32字节时) |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 压缩列表实现的列表(每个元素大小小于64字节 且 元素数小于512个) |
REDIS_LIST | REDIS_ENCODING_LINKEDLIST | 双向链表实现的列表(某个元素大小大于64字节 或 元素数大于512个) |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 压缩列表实现的哈希表(每个元素大小小于64字节 且 元素数小于512个) |
REDIS_HASH | REDIS_ENCODING_HT | 字典实现的哈希表(某个元素大小大于64字节 或 元素数大于512个) |
REDIS_SET | REDIS_ENCODING_INTSET | 整数集合实现的集合(每个元素都是整数 且 元素数不超过512个) |
REDIS_SET | REDIS_ENCODING_HT | 字典实现的集合(某个元素不是整数 或 元素数超过512个) |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 压缩列表实现的有序集合(每个元素大小小于64字节 且 元素数小于128个) |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 使用跳跃表+字典实现的有序集合(某个元素大小大于64字节 或 元素数超过128个) |