zset底层是基于压缩列表和跳表实现的。
压缩列表本质上就是一个数组,只不过它增加了列表的长度,尾部偏移量,列表元素个数以及列表结束标志。这使得我们在查询列表首位元素时间复杂度为O(1),查询其他位置为O(n)。
那么什么时候采用压缩列表呢?
当zset存储元素个数小于128个 或者 存储所有元素的长度小于64字节 这两种情况使用压缩列表。
跳表是什么?
跳表是一种在链表的基础上增加了多级索引的数据类型。它可以通过多级索引进行转跳,实现快速查找元素的效果。
跳表查找元素的时间复杂度是多少?
O(logn)。同样增删元素时间复杂度为O(logn)。
为什么使用跳表,而不是使用二叉搜索树或者红黑树?
-
zset有一个重要特性就是范围查询,使用跳表可以利用多级索引快速查找起点,然后向后遍历就可以了;而二叉搜索树或者红黑树进行范围查询效率就没有这么高。
-
跳表更容易实现,而二叉搜索树和红黑树需要额外维护节点。