0
点赞
收藏
分享

微信扫一扫

Redis数据类型Zset

1、Zset数据结构简述

zsetRedis提供的一个非常特别的数据结构,常用作排行榜等功能,以用户idvalue,关注时间或者分数作为score进行排序。与其他数据结构相似,zset也有两种不同的实现,分别是zipListskipList

2底层实现

zset 存储示意图:每个 value 后面都携带一个分数,然后用作排序

Redis数据类型Zset_数据

跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。简单说来跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳表能够提供O(logN)的时间复杂度。

看一个有序链表,如下图(最左侧的灰色节点表示一个空的头结点):

Redis数据类型Zset_链表_02

在这样一个链表中,如果我们要查找某个数据,那么需要从头开始逐个进行比较,直到找到包含数据的那个节点,或者找到第一个比给定数据大的节点为止(没找到)。也就是说,时间复杂度为O(n)。同样,当我们要插入新数据的时候,也要经历同样的查找过程,从而确定插入位置。

假如我们每相邻两个节点增加一个指针,让指针指向下下个节点,如下图:

Redis数据类型Zset_数据结构_03

这样所有新增加的指针连成了一个新的链表,但它包含的节点个数只有原来的一半。现在当我们想查找数据的时候,可以先沿着这个新链表进行查找。当碰到比待查数据大的节点时,再回到原来的链表中进行查找。比如,我们想查找23,查找的路径是沿着下图中标红的指针所指向的方向进行的:

Redis数据类型Zset_数据结构_04

  • 23首先和7比较,再和19比较,比它们都大,继续向后比较。
  • 但23和26比较的时候,比26要小,因此回到下面的链表(原链表),与22比较。
  • 23比22要大,沿下面的指针继续向后和26比较。23比26小,说明待查数据23在原链表中不存在,而且它的插入位置应该在22和26之间。

3将压缩链表和跳跃链表作一个对比吧

Redis数据类型Zset_数据_05

 

4List Set Zset 对比

Redis数据类型Zset_链表_06

5应用场景 & 学习总结

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复

使用场景:

1、根据时间排序的新闻列表等,

2、 阅读排行

 

6常用命令

Redis数据类型Zset_数据_07

举报

相关推荐

0 条评论