为什么有可比性
它们都是用于解决数据集合的查找问题,即根据指定的key,快速查到它所在的位置或者对应的value。
Redis用跳表不用B+树的原因
redis是内存数据库,儿B+树是为了mysql这种io数据库准备的。B+树每个节点的数量都是一个mysql分区页的大小。
数据结构对比
数据结构 | 实现原理 | 查询方式 | 查找 | 存储 | 插入删除 |
---|---|---|---|---|---|
Hash | 哈希表 | 单key | O(1) | 除数据外没有额外存储 | O(1) |
B+树 | 平衡二叉树扩展而来 | 单key,范围,分页 | O(logn) | 数据,左右指针,页节点指针 | O(logn) |
跳表 | 有序链表扩展而来 | 单key,分页 | O(logn) | 数据,指针,每个节点指针<2,所以占用空间比B+树小 | O(logn) |
redis SortedSet底层数据结构
zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:
- 有序集合保存的元素数量小于128个
- 有序集合保存的所有元素的长度小于64字节
当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。