Redis的ZSet有序集合

一.ZSet有序集合介绍

zset是一个有序的集合,所谓的有序就代表一个集合[1,2,3]和集合[1,3,2]不是等价的。

排序的规则是给zset的member中引入了一个属性,这个属性就是分数。

分数是一个浮点类型的数据,每个member都会安排一个分数,进行排序的时候,就是依照此处的分数大小进行升序/降序操作。

需要注意的是,member是唯一的,但是score(分数)可以不是唯一的。

二.ZSet普通命令

1.ZADD

往集合中添加元素和分数,member和score不是键值对结构,内部也是通过升序进行排序

  • NX | XX
    NX:如果member不存在,添加一个新的member,存在则不做处理。
    XX:如果member存在,则覆盖原来的score,如果不存在,则不做处理。
    如果此时没有选择NX | XX的其中一种,则按照默认来进行。默认情况下,member不存在,则添加一个新的member,如果member存在,则覆盖原来的score。

  • GT | LT
    LT:只会更新存在的member的score,并且只有当新的score比旧的score小时,这个更新才会成功
    GT:只会更新存在的member的score,并且只有当新的score比旧的score大时,这个更新才会成功

  • CH
    将ZADD的返回值更改为更改的元素总数,所谓的更改的元素总数是指的已经存在的元素个数和新添加的元素并且为其更改了分数,在命令行中指定的具有与过去相同分数的元素则不会计算在内。添加CH后的返回值也不会是成功添加新元素的个数了。

  • INCR
    当指定这个选项时,ZADD的行为类似于ZINCRBY。在这种模式下只能指定一个分数-元素对。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

演示:

  • 使用默认操作:
    在这里插入图片描述
    在这里插入图片描述
    如果此时改变分数,排序也会自动发生改变:
    在这里插入图片描述

  • NX使用:
    在这里插入图片描述
    在这里插入图片描述

  • XX:
    在这里插入图片描述
    在这里插入图片描述

  • CH使用:
    在这里插入图片描述

  • INCR使用:
    在这里插入图片描述

2.ZCARD

获取zset的元素个数

在这里插入图片描述

演示:
在这里插入图片描述

3.ZCOUNT

返回元素member在[min,max]区间的分数score,还可以通过(来排除边界值,也就是开区间,并且min和max也可以是浮点数的形式

在这里插入图片描述

演示:

  • 闭区间
    在这里插入图片描述

  • 开区间
    在这里插入图片描述

  • 获取整个集合
    inf是无穷大的意思
    在这里插入图片描述

4.ZRANGE

查找指定区间的元素,也可以将分数显示出来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

演示:
在这里插入图片描述

5.ZREVRANGE

逆序查询指定区间的元素和分数

在这里插入图片描述

演示:
在这里插入图片描述

6.ZRANGEBYSCORE

按照分数查找元素member,和zcount类似。

在这里插入图片描述
在这里插入图片描述

演示:
在这里插入图片描述

7.ZPOPMAX

删除并且返回分数最大的count个元素。如果存在多个元素,分数相同,同时为最大值,删除时,按照member字符串的字典先后顺序来进行删除一个。

在这里插入图片描述

演示:
在这里插入图片描述

8.BZPOPMAX

ZPOPMAX的阻塞版本的命令

在这里插入图片描述

演示:
在这里插入图片描述

9.ZPOPMIN

删除有序集合中的最小的count个元素

在这里插入图片描述

演示:
在这里插入图片描述

10.BZPOPMIN

ZPOPMIN的阻塞命令

在这里插入图片描述

演示:

在这里插入图片描述

11.ZRANK

获取指定元素的排名

在这里插入图片描述

演示:

在这里插入图片描述

12.ZREVRANK

获取member元素的下标,但是会进行逆置

在这里插入图片描述

演示:

在这里插入图片描述

13.ZSCORE

返回指定元素的分数

在这里插入图片描述

演示:

在这里插入图片描述

14.ZREM

删除指定元素

在这里插入图片描述

演示:
在这里插入图片描述

15.ZREMRANGEBYRANK

删除指定下标范围

在这里插入图片描述

演示:
在这里插入图片描述

16.ZREMRANGEBYSCORE

通过分数来指定删除的区间

在这里插入图片描述

演示:

在这里插入图片描述

17.ZINCRBY

对指定元素member进行加减分数操作,加减分数可以是小数

在这里插入图片描述

演示:

在这里插入图片描述

18.ZINTERSTORE

  • 计算由指定键给出的numkeys排序集的交集,并将结果存储在destination中。在传递输入键和其他(可选)参数之前,必须提供输入键的数量(numkeys)。

  • 使用WEIGHTS选项,可以为每个输入排序集指定一个乘法因子。这意味着在传递给聚合函数之前,每个输入排序集中的每个元素的分数都要乘以这个因子。当权重未给定时,乘法因子默认为1。。

  • AGGREGATE默认情况下,元素的结果分数是其在其存在的排序集中的分数之和也就是SUM,如果使用MIN或者MAX,分数的结果就是MIN或者MAX。

在这里插入图片描述

演示:

  • 默认情况:
    在这里插入图片描述

  • 使用WEIGHTS:
    在这里插入图片描述

  • 使用AGGREGATE:
    在这里插入图片描述在这里插入图片描述

19.ZUNIONSTORE

求并集,和ZINTERSTORE的参数相同,不再过多重复。

在这里插入图片描述

演示:

  • 默认情况:
    在这里插入图片描述
  • WEIGHTS:
    在这里插入图片描述
  • AGGREGATE:
    在这里插入图片描述

三.ZSet内部编码方式

1.ziplist

如果有序集合中的元素个数较少,或者单个元素体积较小
在这里插入图片描述

2.skiplist

如果元素个数比较多,或者单个体积元素体积较大
在这里插入图片描述

四.ZSet应用场景

排行版机系统

  • 微博的热搜
  • 游戏天梯积分
  • 成绩排行
    ……

关键要点:
用来排行的分数是实时变化的,所以就可以直接使用ZSet来完成上述的操作。

在游戏天梯排行中,只需要将玩家信息和对应的分数给放到有序集合中即可,自动就能够形成了一个排行榜,随时可以按照排行(下标),按照分数进行范围查询。

随着分数发生改变,也可以比较方便的使用ZINCRBY来进行修改分数,排行顺序也能自动太调整。

微博热度:
微博热度通过综合数值,浏览量、点赞量、转发量、评论量等等……具体有多少个维度,每个维度的权重(WEIGHTS)怎么进行分配,都会有公司的专门团队进行规划

根据每个维度,计算得到综合得分就是热度,此时就可以借助ZINTERSTORE和ZUNIONSTORE按照加权方式处理了。

此时就可以把上述每个维度的数值放到一个有序集合中,member就是微博的id,score就是各自维度的数值,通过ZINTERSTORE或者ZUNIONSTORE把上述有序集合按照约定好的权重,进行集合间的运算即可,得到的结果集合的分数就是热度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值