问题描述
我研究了Redis的实现,知道skiplist
后面有两个数据结构(ziplist
和zset
)。我知道 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),时间复杂度很重要,因为它会影响并发性能。