redis 底层数据结构
动态字符串SDS
优点
- 获取字符串长度的时间复杂度O(1)
支持动态扩容,减少内存分配次数
新字符串小于1M – 新空间为扩展后字符串长度的两倍 + 1
新字符串大于1M – 新空间为扩展后字符串长度 + 1M + 1. 内存预分配
- 二进制安全(记录了字符串长度)
IntSet
IntSet升级流程
Dict
扩容
条件:
- 哈希表的LoadFactor(负载因子) >= 1 且服务器没有执行bgsave 或者bgrewriteaof等后台进程
- 负载因子 > 5
收缩
条件 负载因子小于0.1
rehash
ZipList 特殊的“双端链表(具备双端链表的许多特性)” [为了节省内存设计]
由一系列特殊编码的连续内存块
组成,可以在任意一端以O(1)时间复杂度进行压入/弹出操作。
ZipList的连锁更新问题
ZipList的每个Entry都包含previous_entry_length来记录上一个节点的大小:
- 前一节点的长度小于254字节,previous_entry_length 1个字节
- 前一节点的长度大于254字节,previous_entry_length 5个字节
QuickList
每个节点是一个ZipList的双端链表,可以对节点的ZipList做压缩。
list-max-ziplist-size:
list-compress-depth [控制首尾不压缩的节点个数]