为什么Redis使用skiplist来实现zset

问题描述

我研究了Redis的实现,知道skiplist后面有两个数据结构(ziplistzset)。我知道 skiplist 的一些基本思想(保持多个指针以更快地访问下一个元素,搜索的平均时间复杂度为 O(logN))。

我的问题是:
看了资料说Redis会用skiplist来实现zset有两种情况,第一:zset中成员多,第二:zset中成员长{{1 }}。

在这两种情况下使用string代替skiplist有什么好处,为什么这两种情况需要特殊处理?为什么我们不总是使用一种数据结构来实现 ziplist

解决方法

ziplist 的搜索和更新时间复杂度为 O(n),而skiplist 的时间复杂度为 O(logN)

ziplist 的唯一好处是内存使用。由于zip list采用线性内存地址实现,没有指向其他节点的指针,可以为Redis节省大量内存空间。

当zset中的成员很少时,O(N)和O(logN)不会有显着差异。但是内存使用会有很大的差异(假设你有 1m 个 zset 的键,每个 zset 只有 10 个成员)。

当zset中有很多成员时(比如1m),时间复杂度很重要,因为它会影响并发性能。