C++ 为什么Redis使用skiplist实现zset
我研究了Redis的实现,我知道在C++ 为什么Redis使用skiplist实现zset,c++,data-structures,redis,C++,Data Structures,Redis,我研究了Redis的实现,我知道在zset后面有两种数据结构(skiplist和ziplist)。我知道skiplist的一些基本概念(保持多个指针更快地访问下一个元素,搜索的平均时间复杂度为O(logN)) 我的问题是: 我读到的信息说,Redis将使用skiplist实现zset,有两种情况,第一种情况是zset中有很多成员,第二种情况是zset中的成员长字符串 在这两种情况下使用skiplist而不是ziplist有什么好处,为什么这两种情况需要特殊处理?为什么我们不总是使用一个数据结构来
zset
后面有两种数据结构(skiplist
和ziplist
)。我知道skiplist
的一些基本概念(保持多个指针更快地访问下一个元素,搜索的平均时间复杂度为O(logN))
我的问题是:我读到的信息说,Redis将使用
skiplist
实现zset
,有两种情况,第一种情况是zset中有很多成员,第二种情况是zset
中的成员长字符串
在这两种情况下使用skiplist
而不是ziplist
有什么好处,为什么这两种情况需要特殊处理?为什么我们不总是使用一个数据结构来实现zset
?ziplist是O(n)搜索和更新的时间复杂度,skiplist是O(logN)
ziplist的唯一好处是内存使用。由于zip列表是通过线性内存地址实现的,没有指向其他节点的指针,因此可以为Redis节省大量内存空间
当zset中只有很少的成员时,O(N)和O(logN)不会有显著差异。但是内存使用情况会有巨大的差异(假设您有1m个zset键,每个zset只有10个成员)
当zset中有很多成员(比如1m)时,时间复杂度很重要,因为它会影响并发性能。ziplist是O(n)搜索和更新的时间复杂度,skiplist是O(logN)
ziplist的唯一好处是内存使用。由于zip列表是通过线性内存地址实现的,没有指向其他节点的指针,因此可以为Redis节省大量内存空间
当zset中只有很少的成员时,O(N)和O(logN)不会有显著差异。但是内存使用情况会有巨大的差异(假设您有1m个zset键,每个zset只有10个成员)
当zset中有很多成员(比如1m)时,时间复杂度很重要,因为它会影响并发性能