6.Redis数据类型(ZSET)

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的销量是15zadd goods:sellsort 9 1001 15 1002
有一个客户又买了2件商品1001,商品编号1001销量加2zincrby goods:sellsort 2 1001
求商品销量前10名ZRANGE goods:sellsort 0 9 rev withscores
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值