Redis学习之旅 ZSet(Sorted set)篇
Redis学习之旅 ZSet(Sorted set)篇
为啥它叫ZSet?因为Set的开头字母也是S,Sorted Set缩写为SSet不合适 ,会导致命令冲突 ,所以干脆用Z代替,ZSet出生了~
它的出现也是解决set天生无序的问题
命令学习
redis-cli模式下键入 help @sorted_set就可以快速相关的命令集合
1.0 时代
命令 | 起始版本 | 作用 | 示例 |
---|---|---|---|
ZADD | 1.2.0 | 添加元素 | ZADD key [NX |
ZCARD | 1.2.0 | 和SCARD很类似,统计Key下有多少个元素 | ZCARD key |
ZINCRBY | 1.2.0 | 对元素进行累加操作 | ZINCRBY key increment member |
ZRANGE | 1.2.0 | 按分值获取指定范围内元素 | ZRANGE key start stop [WITHSCORES] |
ZRANGEBYSCORE | 1.0.5 | 按分值上下限获取指定元素 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] |
ZREM | 1.2.0 | 删除一个或者多个元素 | ZREM key member [member …] |
ZREMRANGEBYSCORE | 1.2.0 | 删除给定的索引范围内的元素 | ZREMRANGEBYSCORE key min max |
ZREVRANGE | 1.2.0 | 反转列表 | ZREVRANGE key start stop [WITHSCORES] |
ZSCORE | 1.2.0 | 获取指定元素的分值 | ZSCORE key member |
知识点
ZADD
- NX:和string 一样,不存在时才能操作成功,即新增
- XX 和string 一样,存在时才能操作成功,即更新
- CH 本次命令的返回值是因为本次的操作引起已有元素的分值发生了变化的个数是几个
- INCR:对分值进行添加操作,与ZINCRBY类似
这里不太好理解的就是CH模式,举例
- 一开始始有 a,b,c三个元素在集合中,分值分别为1,2,3
- 通过zadd 添加 b-4 c-5 d-6,会返回1,代码本次新增了一个元素
- 使用ch模式添加 c-8 d-9 e-10,如果不带CH命令,还是会返回1,但是带了CH,就返回了3,因为本次c ,d,e的分值都发生了变化
ZRANGE /ZRANGEBYSCORE
这里其实是两个维度的问题,第一个是在给定的范围内按索引查询
第二个是在给定的分值范围内进行数据的过滤过滤
2.0 时代
命令 | 起始版本 | 作用 | 示例 |
---|---|---|---|
ZCOUNT | 2.0.0 | 按分值范围统计元素个数 | ZCOUNT key min max |
ZINTERSTORE | 2.0.0 | 求交集 | ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] |
ZLEXCOUNT | 2.8.9 | 计算指定元素间的元素个数 | ZLEXCOUNT key min max |
ZRANGEBYLEX | 2.8.9 | 获取范围内的元素 | ZRANGEBYLEX key min max [LIMIT offset count] |
ZRANK | 2.0.0 | 分值排名 | ZRANK key member |
ZREMRANGEBYLEX | 2.8.9 | 按元素进行删除 | ZREMRANGEBYLEX key min max |
ZREMRANGEBYRANK | 2.0.0 | 按排名进行删除 | ZREMRANGEBYRANK key start stop |
ZREVRANGEBYLEX | 2.8.9 | 按元素反转队列 | ZREVRANGEBYLEX key max min [LIMIT offset count |
ZREVRANGEBYSCORE | 2.2.0 | 按分值反转队列 | ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] |
ZREVRANK | 2.0.0 | 倒序排名 | ZREVRANK key member |
ZSCAN | 2.8.0 | SCAN命令 | ZSCAN key cursor [MATCH pattern] [COUNT count] |
ZUNIONSTORE | 2.0.0 | 求并集 | ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] |
知识点
2.0版本更新了很多命令,下面对不太容易理解的命令进行解释
ZINTERSTORE/ZUNIONSTORE
交集,并集的概念其实在set里已经讲过,但是这里有个问题,每个元素是通过score来进行的排名,那么如果进行交/并其实就需要给定一个规则
其中有个参数要讲一下,numKeys 是告诉redis,本次参与计算的有几个key,估计是为了防止误解析后缀的命令而设计 的
WEIGHTS 参数是用来告诉redis,每一组的key里面的数值如何取权重
AGGREGATE 则是最终显示分数的计算规则,是取和还是取最小值最大值
ZLEXCOUNT /ZRANGEBYLEX
用来计算指定范围中的数据的数量,这有几个先决条件:
一是队列需要是有序的,ZSET天生满足
二是需要给出一个key的范围段
- 成员名称前需要加 [ 符号作为开头, [ 符号与成员之间不能有空格
- 可以使用 - 和 + 表示得分最小值和最大值
- min 和 max 不能反, max 放前面 min放后面会导致返回结果为0
- 计算成员之间的成员数量时,参数 min 和 max 的位置也计算在内。
- min 和 max 参数的含义与 zrangebylex 命令中所描述的相同
ZREMRANGEBYLEX/ZREMRANGEBYRANK
看着雷同的命令,一个是基于lex元素来删除
一个是基于排名来删除,需要注意的事,分值低的排在前面
5.0 时代
命令 | 起始版本 | 作用 | 示例 |
---|---|---|---|
BZPOPMAX | 5.0.0 | 弹出几个最大值,要是没元素,就阻塞 | BZPOPMAX key [key …] timeout |
BZPOPMIN | 5.0.0 | 弹出几个最小值,要是没元素,就阻塞 | BZPOPMIN key [key …] timeout |
ZPOPMAX | 5.0.0 | 弹出几个最大值 | ZPOPMAX key [count] |
ZPOPMIN | 5.0.0 | 弹出几个最小值 | ZPOPMIN key [count] |
应用场景
- 氪金排行榜
- 游戏战略排行榜
- 按时间提醒的消息等等
- 基本上一些使用排序玩法的操作都可以考虑可不可以用它来实现