redis ZSET 浅析

336 阅读2分钟

我正在参与掘金创作者训练营第5期,点击了解活动详情

ZSET 是 redis 提供的一种储存有序数据的一种数据结构。可以用在一些广义上的实时排行榜应用场景上,例如直播间中的弹幕消息等1,如果认为弹幕是依据时间戳排序的,这就契合了 ZSET 的用途。

ZSET 功能

首先 ZSET 仍然被可以算作 SET,其次则是它的所谓有序性,具体来说就是它让值可以关联一个所谓的score,score则用于排序。

基于有序这个原因,ZSET提供了基础的单元素增删改查功能之外的范围查询功能,这些操作的具体命令可以可以参考官方手册中的详细说明。

ZSET 底层原理

ZSET 底层是一种被称作跳表的数据结构,它的特点从头或者尾开始跳跃着寻找值。它依赖于双向链表,并且每个节点会连接到多个节点,以便于它能够跳跃到一个合适的位置。理想情况下可以这样认为,每个节点实际上是多层的同一个节点,内部仍然可以认为实现了一个类型二叉树或者金字塔形状的数据结构。

与二分查找对比,可知需要在中间节点增加足够的层数以保证性能,因为有不同的层才能让节点能跳跃到不同的位置,然而由于链表的特性,中间节点是个比较虚的概念,所以实际上节点层数的增加基本是基于概率的,基于纯理论的分析可以参考论文2,我们并不考虑精确的层数提升。总而言之,它的操作复杂度还是收敛在 O(log(N)) 上。

除此之外,ZSET 还提供了所谓的rank,也就是排名的功能,这个功能的实现是通过每个节点中一个所谓的span字段实现的,也就是和前一个节点之间跨越的距离,因为链表本身也无法提供较低复杂度的基于位置的索引功能。

基于这两种特别的实现,ZSET才得以提供基于值范围以及基于排名范围的查询功能。

Footnotes

  1. 使用Redis搭建视频直播间信息系统

  2. Skip Lists: A Probabilistic Alternative to Balanced Trees