目录
1、ZADD
命令:ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
说明:将具有指定分数的所有指定成员添加到存储在关键字处的排序集合中。可以指定多个分数+成员对。如果指定的成员已经是排序集合的成员,则会更新分数,并将元素重新插入到正确的位置,以确保排序正确。分值应该是双精度浮点数字的字符串表示形式
127.0.0.1:6379> zadd zset1 10 s1 30 s2 20 s3
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "10"
3) "s3"
4) "20"
5) "s2"
6) "30"
zset1中,s1的分数是10,s2是30,s3是20,所以最后集合排序结果应该是s1,s3,s2
可选参数说明:
(1)NX | XX:与set的nx一样,只能添加新元素;xx则是只能更新已存在的元素
127.0.0.1:6379> zadd zset1 nx 70 s3
(integer) 0
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "10"
3) "s2"
4) "30"
5) "s3"
6) "50"
(2)GT | LT:GT仅当新分数大于当前分数时才更新现有元素,此标志不会阻止添加新元素。LT与之相反。下面指令是对GT的测试
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "10"
127.0.0.1:6379> zadd zset1 gt 9 s1
(integer) 0
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "10"
127.0.0.1:6379> zadd zset1 gt 19 s1
(integer) 0
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "19"
(3)CH:该参数的作用是改变返回值
1)在默认情况下,返回的是新添加的成员的总数,发生更新的成员不进行计数,所以上方指令的使用中,更改分数后返回值为0
2)在使用该参数后,返回的是发生变化的成员总数,即 新添成员数+发生改变的成员数。(若是已存在的成员,分数相同也不会更新)
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "s1"
2) "10"
3) "s2"
4) "11"
127.0.0.1:6379> zadd zset ch 30 s1 20 s3
(integer) 2
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "s2"
2) "11"
3) "s3"
4) "20"
5) "s1"
6) "30"
(4)INCR:当指定此选项时,ZADD的作用类似于ZINCRBY。在此模式下只能指定一个分数元素对。ZINCRBY指令在后续补充,简单作用就是增加或减少分数值。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "19"
3) "s2"
4) "20"
127.0.0.1:6379> zadd zset1 incr -10 s1
"9"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "9"
3) "s2"
4) "20"
2、ZRANGE
命令:ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
说明:按照元素分数从小到大的顺序,返回索引从 start 到 stop 之间的所有元素(WITHSCORES表示元素的分数和元素一起返回)
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "s1"
2) "9"
3) "s2"
4) "20"
可选参数说明:
(1)BYSCORE:返回排序集at key中得分在 start 和 end 之间的所有元素。元素被认为是从低到高的顺序排列。(默认情况下,start 到 end 的分数范围是闭区间,需要开区间,可使用 “ ( ” 实现;具有相同分数的元素按字典顺序返回(这遵循Redis中排序集实现的属性,不涉及进一步的计算))(替代相同作用的过时指令:ZRANGEBYSCORE ,该指令于Redis version 6.2.0过时)
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "s1"
2) "8"
3) "s2"
4) "9"
5) "s3"
6) "10"
127.0.0.1:6379> zrange zset 8 (10 byscore withscores
1) "s1"
2) "8"
3) "s2"
4) "9"
上面指令查询范围为:[8, 10)
(2)BYLEX:当已排序集合中的所有元素都以相同的分数插入时,为了强制字典排序,此命令将已排序集合的所有元素按键返回,其值介于 start 和 end 之间。(该命令不能与 withscores一起使用)(替代相同作用的过时指令:ZRANGEBYLEX ,该指令于Redis version 6.2.0过时)
该指令与 BYSCORE 不同之处在于其使用了C语言的memcmp() 函数,比较元素大小,元素被认为是从低到高的字符串排序。如果公共部分相同,则较长的字符串被认为大于较短的字符串。(memcmp() 函数具体功能可查看链接:C 库函数 – memcmp() | 菜鸟教程)
由于比较的不是数字,所以 start 与 end 表示全部数据,使用 - 和 + 代替 0 -1
127.0.0.1:6379> zrange zset - + bylex
1) "s1"
2) "s2"
3) "s3"
有效的开始和停止必须以(或[,以指定范围项是开区间还是闭区间。
127.0.0.1:6379> zadd set1 10 a 20 b 30 c
(integer) 3
127.0.0.1:6379> zrange set1 (b + bylex
1) "c"
(3)REV:反转返回的元素(替代相同作用的过时指令:ZREVRANGE,该指令于Redis version 6.2.0过时)
127.0.0.1:6379> zrange set1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrange set1 0 -1 rev
1) "c"
2) "b"
3) "a"
(4)LIMIT:可选的LIMIT参数可用于从匹配元素中获取子范围(类似于SQL中的SELECT LIMIT 偏移量,count)。负的 count ,-1 表示倒数第一个数,-2表示倒数第二个数,以此类推。请记住,如果 offset 较大,则在到达要返回的元素之前,需要遍历 offset 元素的排序集,这可能会增加 O(N) 的时间复杂度。(该参数仅支持与 BYSCORE 和 BYLEX 一起使用)
127.0.0.1:6379> zadd set2 10 a 10 b 12 c 14 d 15 e
(integer) 5
127.0.0.1:6379> zrange set2 10 15 byscore limit 0 2 withscores
1) "a"
2) "10"
3) "b"
4) "10"
127.0.0.1:6379> zrange set2 10 15 byscore limit 2 2 withscores
1) "c"
2) "12"
3) "d"
4) "14"
127.0.0.1:6379> zrange set2 10 15 byscore limit 4 2 withscores
1) "e"
2) "15"
3、ZSCORE
命令:ZSCORE key member
说明:获取元素的分数,如果排序集中不存在成员,或者键不存在,则返回nil。
127.0.0.1:6379> zadd zset1 10 z1 20 z2 20 z3
(integer) 3
127.0.0.1:6379> zscore zset1 z2
"20"
4、ZCARD
命令:ZCARD key
说明:获取集合中元素的数量,键不存在,返回 0。
127.0.0.1:6379> zcard zset1
(integer) 3
127.0.0.1:6379> zcard zset111
(integer) 0
5、ZREM
命令:ZREM key member [member ...]
说明:从存储在键处的已排序集合中删除指定的成员。将忽略不存在的成员。
127.0.0.1:6379> zrange zset1 0 -1
1) "z1"
2) "z2"
3) "z3"
127.0.0.1:6379> zrem zset1 z1
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1
1) "z2"
2) "z3"
6、ZINCRBY
命令:ZINCRBY key increment member
说明:增加/减少某个元素的分数,分值应该是数值的字符串表示形式,并接受双精度浮点数字。可以提供一个负值来减少分数。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "z2"
2) "20"
3) "z3"
4) "20"
127.0.0.1:6379> zincrby zset1 -10 z2
"10"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "z2"
2) "10"
3) "z3"
4) "20"
7、ZCOUNT
命令:ZCOUNT key min max
说明:获得指定分数范围内的元素个数,min 和 max 参数具有与ZRANGEBYSCORE相同的语义。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "z2"
2) "10"
3) "z3"
4) "20"
127.0.0.1:6379> zcount zset1 0 20
(integer) 2
127.0.0.1:6379> zcount zset1 0 10
(integer) 1
8、ZMPOP(version 7.0.0)
命令:ZMPOP numkeys key [key ...] <MIN | MAX> [COUNT count]
说明:从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对。当使用MIN修饰符时,弹出的元素是第一个非空排序集中得分最低的元素。MAX修改器会弹出得分最高的元素,numkeys 表示 key 的数量。
127.0.0.1:6379> zadd set 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> zmpop 1 set min
1) "set"
2) 1) 1) "one"
2) "1"
127.0.0.1:6379> zrange set 0 -1
1) "two"
2) "three"
3) "four"
4) "five"
可选的COUNT可用于指定要弹出的元素数量,默认情况下设置为1,弹出元素的数量是排序集的基数和COUNT值中的最小值。
127.0.0.1:6379> zadd set 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zadd set1 1 oneo 2 twot 3 threet
(integer) 3
127.0.0.1:6379> zmpop 2 set set1 min count 4
1) "set"
2) 1) 1) "one"
2) "1"
2) 1) "two"
2) "2"
3) 1) "three"
2) "3"
127.0.0.1:6379> zmpop 2 set set1 min count 4
1) "set1"
2) 1) 1) "oneo"
2) "1"
2) 1) "twot"
2) "2"
3) 1) "threet"
2) "3"
9、ZRANK
命令:ZRANK key member [WITHSCORE]
说明: 返回存储在关键字处的已排序集合中成员的排名,分数从低到高依次排列。排名(或指数)基于0,这意味着得分最低的成员的排名为0。使用 ZREVRANK 可以获得分数从高到低排序的元素。
127.0.0.1:6379> zrange zset1 0 -1
1) "z5"
2) "z2"
3) "z3"
4) "z4"
127.0.0.1:6379> zrank zset1 z5
(integer) 0
127.0.0.1:6379> zrank zset1 z3
(integer) 2
10、使用场景
根据商品的销售量对商品进行排序 :
(1)定义商品销售排行榜,key 为 goods:sellsort,分数为商品销售量
(2)假设商品编号0010销售量为100,编号0051销售量为200
127.0.0.1:6379> zadd goods:sellsort 100 0010 200 0051
(integer) 2
(3)客户买了两件商品0010
127.0.0.1:6379> zincrby goods:sellsort 2 0010
"102"
(4)展示商品销量前十
127.0.0.1:6379> zrange goods:sellsort 0 9 rev withscores
1) "0051"
2) "200"
3) "0010"
4) "102"
本文详细介绍了Redis中排序集合的相关操作,包括ZADD用于添加和更新成员及其分数,ZRANGE用于按分数或字典顺序获取成员,ZSCORE获取成员的分数,ZCARD计算集合元素数量,ZREM删除成员,ZINCRBY调整分数,ZCOUNT统计分数范围内的成员数量,以及新版本的ZMPOP命令用于批量操作。这些命令在数据存储和排序场景中非常实用。

8318

被折叠的 条评论
为什么被折叠?



