Redis数据结构学习 - Hash & List | 青训营笔记
1.3 Hash
ziplist + hashTable / listpack + hashTable
两个参数
- hash-max-ziplist-entry : 压缩列表中数据的最大个数 (512)
- hash-max-ziplist-value: 压缩列表中值得最大大小 (64)
- 上面得只要有一个不满足,就会变成HashTable
ZipList
- 三个参数 (专指 entry )
- prevlen : 前一个节点的长度
- encoding: 编码类型和长度
- data :数据
- 为什么不用双向列表
- 因为双向列表内存的不连续性,CPU缓存不好利用,因为局部性原理
- 而且可能指针记录的数据比数据还大
- 关于它:
- 找头尾的效率是O(1) ,但是找中间的内容时间复杂度就是O(N)了,但是因为局部性原理,可以CPU缓存,所以效率不差

ListPack
- 三个参数
- encoding: 编码类型
- data(content): 数据
- len : encoding + data的长度
- 为什么不用压缩列表
- 因为连锁更新,prevlen它的长度,根据不同情况,字节数不同(1 / 5个字节),这样就会导致往头部插入数据的时候,会导致后面的所有prevlen发生改变,出现连锁更新
- 关于它


1.4 List
quicklist ( 双向列表 + 压缩列表 )
- quicklist维护了一个双向链表,每个节点都存了一个ziplist ( redis7变成了listpack )
