Redis数据结构学习 - Hash & List | 青训营笔记

89 阅读1分钟

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缓存,所以效率不差

ziplist.png

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

listpacg-entry.png

listpack.png

1.4 List

quicklist ( 双向列表 + 压缩列表 )

  • quicklist维护了一个双向链表,每个节点都存了一个ziplist ( redis7变成了listpack )

_Redis_Redis-quickList.png