Redis 有序集合(Zsets) 复习

2023-03-06 09:07:19 浏览数 (2)

介绍

sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收。

应用场景

主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等

专有名词区分

需注意有序集合中 排名分数索引字典 等词区分。 字典 相当于集合中的元素,也是说 分数下面的 其中 排名 就是根据 分数从小到大)进行排序后的 索引 值 也就是说有序集合中 索引 就是 排名

命令大纲

新增(ZADD、ZINCRBY)

添加一个或多个成员,或者更新成员的分数(ZADD)

代码语言:javascript复制
# NX|XX 仅更新存在的成员,不添加新成员| 不更新存在的成员,只添加新成员
# GT|LT 更新新的分值比当前分值小的成员,不存在则新增| 更新新的分值比当前分值大的成员,不存在则新增 (6.2版本添加)
# CH 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内
注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。
# INCR ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对
注意: GT, LT 和 NX 三者互斥不能同时使用。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

CH 是默认自带

返回值
代码语言:javascript复制
> ZADD zsets1 1 php 2 java 3 python 4 c  
(integer) 4

对指定成员的分数加上增量 (ZINCRBY)

代码语言:javascript复制
# increment 增量
ZINCRBY key increment member
返回值
代码语言:javascript复制
> ZINCRBY zsets1 12 php
"14"

查询(ZCARD、ZCOUNT、ZLEXCOUNT、ZRANGE、ZRANGEBYSCORE、ZREVRANK、ZSCORE、ZINTERSTORE、ZUNIONSTORE、ZREVRANGE、ZREVRANGEBYSCORE、ZRANK)

获取有序集合的成员数(ZCARD)

代码语言:javascript复制
ZCARD key
返回值
代码语言:javascript复制
> ZCARD zsets1
(integer) 6

计算在有序集合中指定区间分数的成员数(ZCOUNT)

代码语言:javascript复制
# min 最大分数 max 最小分数
ZCOUNT key min max
返回值
代码语言:javascript复制
> ZCOUNT zsets1 0 100
(integer) 6

获取值的区间内成员数量(ZLEXCOUNT)

代码语言:javascript复制
ZLEXCOUNT key min max

注意:此处是值,并不是分数

返回值
代码语言:javascript复制
> ZLEXCOUNT zsets4 [a [z
(integer) 8
> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"

通过索引区间返回有序集合指定区间内的成员(ZRANGE)

代码语言:javascript复制
# WITHSCORES 返回分数
ZRANGE key start stop [WITHSCORES]
返回值
代码语言:javascript复制
> ZRANGE  zsets1 0 -1
1) "a"
2) "php"
3) "java"
4) "python"
5) "c  "
6) "c"

通过分数返回区间内的成员(ZRANGEBYSCORE)

代码语言:javascript复制
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

在分数中 ( 是不带等于 如:(5 (10 = 5<score<10; (5 [10= 5<score<=10;

返回值
代码语言:javascript复制
# 显示分数0到100(不包括100)
> ZRANGEBYSCORE zsets4 0 (100 
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c  "
8) "a"
# 全显示
> ZRANGEBYSCORE zsets4 -inf  inf
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c  "
8) "a"
# 从索引1开始取5条数据
> ZRANGEBYSCORE zsets4 -inf  inf limit 1 5
1) "java"
2) "py"
3) "python"
4) "ruby"
5) "c"

指定成员的排名(ZREVRANK)【分数值递减(从大到小)排序】

代码语言:javascript复制
ZREVRANK key member

注意:分数值递减从大到小排列,也就是说获得的排名是倒数第几

返回值
代码语言:javascript复制
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c  "
5) "c"
6) "a"
> ZREVRANK zsets1 c  
(integer) 2

查找成员的分数值(ZSCORE)

代码语言:javascript复制
ZSCORE key member
返回值
代码语言:javascript复制
> ZSCORE zsets1 java
"2"

返回指定成员的排名(ZRANK)

代码语言:javascript复制
ZRANK key member
返回值
代码语言:javascript复制
> ZRANK zsets1 java
(integer) 1
> ZRANK zsets1 php
(integer) 0
> ZRANK zsets1 c  
(integer) 3

> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c  "
8) "a"
> ZRANK zsets4 c
(integer) 5

一个或多个有序集的交集并将结果集存储在新的有序集(ZINTERSTORE)

代码语言:javascript复制
# destination 新的集合 numkeys 合并集合数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
代码语言:javascript复制
> zadd zsets2 1 c   2 py 3 ruby
(integer) 2
> ZINTERSTORE zsets3 2 zsets1 zsets2
(integer) 1
> ZRANGE zsets3 0 -1
1) "c  "

一个或多个有序集的并集并将结果集存储在新的有序集(ZUNIONSTORE)

代码语言:javascript复制
# destination 新的集合 numkeys 合并集合数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
代码语言:javascript复制
> ZUNIONSTORE zsets4 2 zsets1 zsets2
(integer) 8
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c  "
8) "a"

返指定区间内的成员(ZREVRANGE)【通过索引,分数从高到低】

代码语言:javascript复制
ZREVRANGE key start stop [WITHSCORES]
返回值
代码语言:javascript复制
> ZREVRANGE zsets4 0 -1
1) "a"
2) "c  "
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

返回分数区间内的成员(ZREVRANGEBYSCORE)【分数从高到低排序】

代码语言:javascript复制
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

注意:max在前,min在后,不然可能查不到数据

返回值
代码语言:javascript复制
> ZREVRANGEBYSCORE zsets4  inf -inf
1) "a"
2) "c  "
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

删除(ZREM、ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREMRANGEBYLEX)

删除一个或多个成员(ZREM)

代码语言:javascript复制
ZREM key member [member ...]
返回值
代码语言:javascript复制
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c  "
8) "a"
> ZREM zsets4 a c  
(integer) 2
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"

删除排名区间的所有成员 (ZREMRANGEBYRANK)

代码语言:javascript复制
ZREMRANGEBYRANK key start stop
返回值
代码语言:javascript复制
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
> ZREMRANGEBYRANK zsets4 0 3
(integer) 4
> ZRANGE zsets4 0 -1
1) "ruby"
2) "c"

删除分数区间的所有成员(ZREMRANGEBYSCORE)

代码语言:javascript复制
ZREMRANGEBYSCORE key min max
返回值
代码语言:javascript复制
> ZRANGE zsets4 0 -1 WITHSCORES
1) "ruby"
2) "3"
3) "c"
4) "5"
> ZREMRANGEBYSCORE zsets4 -inf  inf
(integer) 2
> ZRANGE zsets4 0 -1 WITHSCORES
(empty array)

移除有序集合中给定的字典区间的所有成员(ZREMRANGEBYLEX)

代码语言:javascript复制
ZREMRANGEBYLEX key min max
返回值
代码语言:javascript复制
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c  "
5) "c"
6) "a"
> ZREMRANGEBYLEX zsets1 (java [aaaa
(integer) 0

其他操作(ZSCAN)

迭代(ZSCAN)

代码语言:javascript复制
ZSCAN key cursor [MATCH pattern] [COUNT count]
返回值

参考字符串迭代

0 人点赞