ZSET
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
ZADD/ZRANGE(添加/查询)
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member…]
用于将一个或多个成员元素及其分数值加入到有序集当中。
如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。
分数值可以是整数值或双精度浮点数。
如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
其中成员的位置按分数值递增(从小到大)来排序,具有相同分数值的成员按字典序(lexicographical order )来排列。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
127.0.0.1:6379> ZADD zset1 60 v1 70 v2 80 v3 90 v4 100 v5
(integer) 5
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
9) "v5"
10) "100"
ZREVRANGE倒序,从6.2.0被视为过期,可以用ZRANGE REV代替。
//倒序
127.0.0.1:6379> ZRANGE zset1 0 -1 REV WITHSCORES
1) "v5"
2) "100"
3) "v4"
4) "90"
5) "v3"
6) "80"
7) "v2"
8) "70"
9) "v1"
10) "60"
ZRANGEBYSCORE
从6.2.0被视为过期,可以用ZRANGE BYSCORE代替
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
//60-90分按照score从小到大排序
127.0.0.1:6379> ZRANGE zset1 60 90 BYSCORE
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> ZRANGE zset1 60 90 BYSCORE WITHSCORES
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
//大于60分小于等于90分
127.0.0.1:6379> ZRANGE zset1 (60 90 BYSCORE WITHSCORES
1) "v2"
2) "70"
3) "v3"
4) "80"
5) "v4"
6) "90"
//从0个元素开始取2个元素
127.0.0.1:6379> ZRANGE zset1 (60 90 BYSCORE LIMIT 0 2 WITHSCORES
1) "v2"
2) "70"
3) "v3"
4) "80"
//从第1个元素开始取2个元素
127.0.0.1:6379> ZRANGE zset1 (60 90 BYSCORE LIMIT 1 2 WITHSCORES
1) "v3"
2) "80"
3) "v4"
4) "90"
ZSCORE 查询分数
ZSCORE key member
返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil
127.0.0.1:6379> ZSCORE zset1 v1
"60"
127.0.0.1:6379> ZSCORE zset1 v8
(nil)
ZCARD 查询个数
ZCARD key
用于计算集合中元素的个数
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> ZCARD zset1
(integer) 5
ZREM 删除元素
ZREM key member [member …]
用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> ZREM zset1 v5 v9
(integer) 1
127.0.0.1:6379> ZREM zset1 v5 v9
(integer) 0
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
ZINCRBY 增加分数
ZINCRBY key increment member
对有序集合中指定成员的分数加上增量 increment,可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
127.0.0.1:6379> ZINCRBY zset1 3 v1
"63"
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v1"
2) "63"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
127.0.0.1:6379> ZINCRBY zset1 19 v5
"19"
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v5"
2) "19"
3) "v1"
4) "63"
5) "v2"
6) "70"
7) "v3"
8) "80"
9) "v4"
10) "90"
ZCOUNT 获取分数范围的元素个数
ZCOUNT key min max
用于计算有序集合中指定分数区间的成员数量。
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v5"
2) "19"
3) "v1"
4) "63"
5) "v2"
6) "70"
7) "v3"
8) "80"
9) "v4"
10) "90"
127.0.0.1:6379> ZCOUNT zset1 60 100
(integer) 4
127.0.0.1:6379> ZCOUNT zset1 65 70
(integer) 1
ZMPOP 弹出元素
ZMPOP numkeys key [key …] <MIN | MAX> [COUNT count]
从redis7.0.0 开始的命令。
从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对。
//弹出分数最小的1一个元素。
127.0.0.1:6379> ZMPOP 1 zset1 min count 1
1) "zset1"
2) 1) 1) "v5"
2) "19"
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v1"
2) "63"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
//测试
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v2"
2) "70"
3) "v22"
4) "70"
5) "v222"
6) "70"
7) "v3"
8) "80"
9) "v4"
10) "90"
127.0.0.1:6379> ZMPOP 1 zset1 min count 1
1) "zset1"
2) 1) 1) "v2"
2) "70"
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v22"
2) "70"
3) "v222"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
ZRANK/ZREVRANK 分数排名
ZRANK key member [WITHSCORE]
返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
ZREVRANK key member [WITHSCORE]
返回有序集中指定成员的排名。其中有序集成员按分数值递增(从大到小)顺序排列。
等级(或索引)是从0开始的,这意味着具有最低/最高分数的成员具有等级0.
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "v22"
2) "70"
3) "v222"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
127.0.0.1:6379> ZRANk zset1 v2
(nil)
127.0.0.1:6379> ZRANk zset1 v222
(integer) 1
127.0.0.1:6379> ZRANk zset1 v22
(integer) 0
127.0.0.1:6379> ZREVRANK zset1 v22
(integer) 3
应用小例子:
1.定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
商品编号1001的销量是9,商品编号1002的销量是15 | zadd goods:sellsort 9 1001 15 1002 |
---|---|
有一个客户又买了2件商品1001,商品编号1001销量加2 | zincrby goods:sellsort 2 1001 |
求商品销量前10名 | ZRANGE goods:sellsort 0 9 rev withscores |