Redis 中的 ZSet
目录
¶概述
zset 的底层数据结构是跳表,不由得产生了这样一个想法:为什么 redis 的 zset 底层选择使用跳表而不是用红黑树来进行存储,毕竟 HashMap 的底层最终使用的就是红黑树
¶跳表与红黑树的抉择
Redis 只在两个地方用到了跳跃表,一个是实现有序集合键(zset),另一个是在集群节点中用作内部数据结构,除此之外,跳表在 Redis 里面没有其他用途。但是为什么底层使用的是跳表而不是红黑树?
¶Redis Zset 为什么使用跳表而不使用红黑树
Redis 只在两个地方用到了跳跃表,一个是实现有序集合键(zset),另一个是在集群节点中用作内部数据结构,除此之外,跳表在 Redis 里面没有其他用途
❓ 为什么 Redis 选择使用跳表而不是使用红黑树尼?
¶HashMap 为什么使用红黑树而不使用跳表
¶为什么有序集合需要同时使用跳表和字典来实现?
在理论上,有序集合可以单独使用字典或跳表的其中一种数据结构来实现,但无论单独使用字典还是跳跃表,在性能上对比起同时使用字典和跳跃表都会有所降低。
举个例子,如果我们只使用字典来实现有序集合,那么虽然能够以 O(1) 复杂度查找成员的分值这一特性会被保留,但是,因为字典以无需的方式来保存集合元素,所以每次在执行范围型操作——比如:ZRANK、ZRANGE 等命令时,程序都需要对字典保存的所有元素进行排序,完成这种排序需要至少 O(NlogN)时间复杂度,以及额外的 O(N)内存空间(因为要创建一个数组来保存排序后的元素)
另一方面,如果只是使用跳跃表实现有序集合,那么跳跃表执行范围型操作的所有优点都会被保留,但因为没有来字典,所以根据成员查找分值这一操作的复杂度将从 O(1) 上升到 O(logN)。因为以上原因,为了让有序集合的查找和范围型操作都尽可能快地执行,Redis 选择了同时使用字典和跳表两种数据结构来实现有序集合
¶附录
HashMap 为什么用红黑树而不用跳表?redis 的 zset 为什么用跳表而不用红黑树?
redis 为什么选择了跳跃表而不是红黑树