Redis设实 - 07 对象 上

《Redis设计与实现 黄建宏 著》第8章
该书基于Redis2.9,即Redis3.0开发版编写

Redis对象数据结构

typedef struct redisObject{
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层实现数据结构的指针
void *ptr;
// 引用计数
int refcount;
// 最后一次被命令程序访问时间
unsigned lru:22;
}robj;
type属性
记录对象的类型
可选值为:
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
encoding属性
记录对象使用的编码,即对象的底层实现数据结构
可选值为:
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
5种类型的可用编码:
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
注,Redis键值对中的键总是字符串对象,而值则可以是5种对象中的一种

相关命令

TYPE
输出值对象的类型
用法:TYPE key
OBJECT ENCODING
输出值对象的底层编码
用法:OBJECT ENCODING key

1. 字符串对象

可用编码
int:保存整数值,且该整数值可用long类型表示
raw:保存字符串值,且该字符串值长度大于32字节
embstr:保存个字符串值,且该字符串值长度小于等于32字节
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
embstr编码
·调用一次内存分配函数分配一块连续空间,空间依次包含redisObject和sdshdr两个结构,而raw编码需调用两次内存分配函数
·embstr编码的字符串对象为只读,执行修改命令时,程序先将对象编码从embstr转换为raw,然后再执行命令
编码转换
·执行命令后,使该对象保存的不再是整数值,而是字符串值,则字符串对象编码从int变为raw
·embstr编码的字符串对象执行修改命令后,字符串对象编码从embstr变为raw
注,
可用long、double类型表示的浮点数在Redis中作为字符串值保存
在需要时,程序会将字符串值转换回浮点数值,执行某些操作后,再将浮点数值转换回字符串值保存在字符串对象中
常用命令及实现
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上

2. 列表对象

可用编码
ziplist,压缩列表
linkedlist,链表
编码转换
同时满足以下2个条件时,使用ziplist编码,否则使用linkedlist编码
·所有字符串长度都小于64字节
·元素数量小于512个
注,
以上条件中的阈值可在配置文件中的list-max-ziplist-value和list-max-ziplist-entries选项修改
常用命令及实现
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上

3. 哈希对象

可用编码
ziplist,压缩列表,键节点、值节点前后相邻
hashtable,字典,键、值都是SDS
编码转换
同时满足以下2个条件时,使用ziplist编码,否则使用hashtable编码
·所有键、值字符串长度都小于64字节
·键值对数量小于512个
注,
以上条件中的阈值可在配置文件中的hash-max-ziplist-value和hash-max-ziplist-entries选项修改
常用命令及实现
Redis设实 - 07 对象 上

4. 集合对象

可用编码
intset,整数集合
hashtable,字典,键是SDS,值是NULL
编码转换
同时满足以下2个条件时,使用intset编码,否则使用hashtable编码
·所有元素都是整数值
·元素数量小于512个
注,
第2个条件中的阈值可在配置文件中的set-max-intset-value选项修改
常用命令及实现
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上

5. 有序集合对象

集合元素按分值升序排序
可用编码
ziplist,压缩列表,1个元素占2个节点,成员节点、分值节点前后相邻
skiplist,底层是zset
typedef struct zset{
zskiplist *zsl;
dict *dict;
}zset;
跳跃表按分值升序保存元素,表节点object属性保存成员、score属性保存分值,通过跳跃表可对集合进行范围操作
字典保存成员到分值的映射,键保存成员、值保存分值,通过字典可用O(1)复杂度查找元素分值
zset虽同时使用跳跃表和字典保存元素,但两种数据结构通过指针共享相同元素的成员和分值,故不会浪费额外内存
同时使用2种数据结构够的原因:为保证查找和范围操作同时具有高性能
Redis设实 - 07 对象 上
编码转换
同时满足以下2个条件时,使用ziplist编码,否则使用skiplist编码
·所有元素成员长度都小于64字节
·元素数量小于128个
注,
第2个条件中的阈值可在配置文件中的zset-max-ziplist-value和zset-max-ziplist-entries选项修改
常用命令及实现
Redis设实 - 07 对象 上
Redis设实 - 07 对象 上