Redis底层数据结构
简单动态字符串(Simple Dynamic String)
特点:主要解决C语言不支持字符串功能,对C语言字符数组进行扩充增加字符串属性与方法。
优点:
- 通过增加长度属性,减少获取长度的复杂度
- 通过预分配和惰性释放来,减少修改字符串长度时需要的内存分配次数
- 二进制安全(RedisAPI通过二进制来处理字符数组,不会象C一样改变数据内容)
- 因本质上存放数据的依然是C字符数组,所有兼容C字符串函数
链表
特点:
- 无环:头节点的前一个节点,和尾节点的下一个节点,均指向NULL
- 双向:每个节点都有前一个和下一个节点
优点
- 带头尾节点与节点数量,有效简化查询
- 可支持多种数据类型
字典
特点:
- 使用Hash Table来存储数据,且使用两个Hash表,一个用于存储数据,另一个用于rehash时中转。
优点:
- 有效减少Rehash的开销(使用渐进式rehash,“标记-复制”)
- 在作为数据库使用时,使用MurmurHash2算法(4.0以上使用SipHash)
跳跃表
扩展阅读(【有料】Redis(2)——跳跃表-CSDN博客)
特点:
- 由zskiplist和zskipnode组成,zskiplist保存跳表的层数、长度
优点:
- 底层使用双向链表存储数据,数据查找更加方便快速
- Redis 跳跃表默认允许最大的层数是 32 ,通过
ZSKIPLIST_MAXLEVEL
设置
整数集合
特点
- 只支持升级,不支持降级通过Int数组实现
优点:
- 升级操作,提高了灵活性,节约了内存
压缩列表
特点:
- 可以有多个节点,每个节点可保存一个字节数组或整数值
- 添加和删除节点有一定几率会引起连锁更新操作
优点:
- 紧凑的顺序型数据结构,节约内存
数据对象
数据对象通过type属性来确定对象类型.
具体如下:
类型常量 | 对象名称 |
REDIS_STRING | 字符串对象 |
REDIS_LIST | 列表对象 |
REDIS_SET | 集合对象 |
REDIS_HASH | 哈希对象 |
REDIS_ZSET | 有序集合对象 |
字符串对象
底层数据结构:小于等于44个字节使用EMSTR,大于44个字节使用SDS结构
编码转换:
int->raw:追加非数字内容则转换为RAW
embstr->raw ,追加或者修改内容长度大于44个字节
列表对象
底层数据结构:使用ziplist(压缩编码)和Linkedlist(链表)
编码转换:
ziplist->linkedlist
- 列表中有元素长度大于64字节
- 列表元素个数大于等于512个
可在配置文件中修改list-max-ziplist-value,list-max-ziplist-entries修改默认配置
哈希对象
底层数据结构:ziplist和hashtable
编码转换:
ziplist->HashTable
- 列表中有元素长度大于64字节
- 列表元素个数大于等于512个
可在配置文件中修改list-max-ziplist-value,list-max-ziplist-entries修改默认配置
集合对象
底层数据结构:isntset或者HashTable
编码转换:
intset->HashTable
集合中有非数字内容
集合的元素数量大于等于512个
set-max-intset-entries,可以修改集合元素个数上限
有序集合对象
底层数据结构:ziplist或者skiplist
编码转换:
1.集合内元素大于等于128个
2.向集合添加,超过64个字节长度的元素
zset-max-ziplist-entries :可修改集合元素个数上限
zset-max-ziplist-value:可修改集合元素长度上限