Redis 有序集合(Zsets) 复习
- 陈大剩
- 2022-09-10 16:13:46
- 1792
介绍
sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收。
应用场景
主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等
专有名词区分
需注意有序集合中 排名、分数、索引、字典、值 等词区分。字典 相当于集合中的元素,也是说 分数下面的 值
其中 排名 就是根据 分数 (从小到大)进行排序后的 索引 值 也就是说有序集合中 索引 就是 排名
命令大纲
新增(ZADD、ZINCRBY)
添加一个或多个成员,或者更新成员的分数(ZADD)
# 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 是默认自带
返回值
> ZADD zsets1 1 php 2 java 3 python 4 c++
(integer) 4
对指定成员的分数加上增量 (ZINCRBY)
# increment 增量
ZINCRBY key increment member
返回值
> ZINCRBY zsets1 12 php
"14"
查询(ZCARD、ZCOUNT、ZLEXCOUNT、ZRANGE、ZRANGEBYSCORE、ZREVRANK、ZSCORE、ZINTERSTORE、ZUNIONSTORE、ZREVRANGE、ZREVRANGEBYSCORE、ZRANK)
获取有序集合的成员数(ZCARD)
ZCARD key
返回值
> ZCARD zsets1
(integer) 6
计算在有序集合中指定区间分数的成员数(ZCOUNT)
# min 最大分数 max 最小分数
ZCOUNT key min max
返回值
> ZCOUNT zsets1 0 100
(integer) 6
获取值的区间内成员数量(ZLEXCOUNT)
ZLEXCOUNT key min max
注意:此处是值,并不是分数
返回值
> 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)
# WITHSCORES 返回分数
ZRANGE key start stop [WITHSCORES]
返回值
> ZRANGE zsets1 0 -1
1) "a"
2) "php"
3) "java"
4) "python"
5) "c++"
6) "c"
通过分数返回区间内的成员(ZRANGEBYSCORE)
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
在分数中 ( 是不带等于 如:(5 (10 = 5<score<10; (5 [10= 5<score<=10;
返回值
# 显示分数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)【分数值递减(从大到小)排序】
ZREVRANK key member
注意:分数值递减从大到小排列,也就是说获得的排名是倒数第几
返回值
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREVRANK zsets1 c++
(integer) 2
查找成员的分数值(ZSCORE)
ZSCORE key member
返回值
> ZSCORE zsets1 java
"2"
返回指定成员的排名(ZRANK)
ZRANK key member
返回值
> 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)
# destination 新的集合 numkeys 合并集合数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
> zadd zsets2 1 c++ 2 py 3 ruby
(integer) 2
> ZINTERSTORE zsets3 2 zsets1 zsets2
(integer) 1
> ZRANGE zsets3 0 -1
1) "c++"
一个或多个有序集的并集并将结果集存储在新的有序集(ZUNIONSTORE)
# destination 新的集合 numkeys 合并集合数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
> 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)【通过索引,分数从高到低】
ZREVRANGE key start stop [WITHSCORES]
返回值
> ZREVRANGE zsets4 0 -1
1) "a"
2) "c++"
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"
返回分数区间内的成员(ZREVRANGEBYSCORE)【分数从高到低排序】
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
注意:max在前,min在后,不然可能查不到数据
返回值
> 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)
ZREM key member [member ...]
返回值
> 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)
ZREMRANGEBYRANK key start stop
返回值
> 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)
ZREMRANGEBYSCORE key min max
返回值
> 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)
ZREMRANGEBYLEX key min max
返回值
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREMRANGEBYLEX zsets1 (java [aaaa
(integer) 0
其他操作(ZSCAN)
迭代(ZSCAN)
ZSCAN key cursor [MATCH pattern] [COUNT count]
返回值
参考字符串迭代
本文参考&引用
赞
(0)














