版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
今天一共有三个命令需要学习,前两个命令很简单,基本看名字就能明白,反向排序和元素移除,主要是第3个命令比较麻烦,返回指定返回内的元素,这个命令的参数比较奇怪,我们一起来看一下。
这篇笔记中的3个命令分别是 ZREVRANK 、 ZREM 、 ZRANGBYLEX ,可以参考:
- 《Redis每日一练(35):ZSCORE、ZINCRBY和ZRANK命令》 中的 ZRANK 命令
- 《Redis每日一练(29):SISMEMBER、SMOVE和SREM命令》 中的 SREM 命令
- 《Redis每日一练(34):ZRANGE、ZREVRANGE和ZCARD命令》 中的 ZRANGE 命令
ZREVRANK
- 最早出现版本:2.0.0
- 时间复杂度:O(log(N))
- 命令参数:ZREVRANK key member
- 操作类型:sorted sets
- 官方文档
作用
返回有序集合中元素的排名或者叫索引,但是顺序是从按照分数从大到小排列的,与 RANK 命令是相反的,如果元素存在返回排名,否则返回 nil ,当指定的键不存在时也会返回 nil,如果指定的键不是有序集合类型则会给出报错信息。
练习
向有序集合中添加元素,然后使用 ZREVRANK 命令查看元素的排名:
127.0.0.1:6379> DEL zset (integer) 1 127.0.0.1:6379> ZADD zset 99 albert 98 tom (integer) 2 127.0.0.1:6379> ZADD zset 95 lili 96 liming (integer) 2 127.0.0.1:6379> ZREVRANGE zset 0 -1 WITHSCORES 1) "albert" 2) "99" 3) "tom" 4) "98" 5) "liming" 6) "96" 7) "lili" 8) "95" 127.0.0.1:6379> ZREVRANK zset albert (integer) 0 127.0.0.1:6379> ZREVRANK zset liming (integer) 2 127.0.0.1:6379> ZREVRANK zset lili (integer) 3 127.0.0.1:6379>
复制
ZREM
- 最早出现版本:1.2.0
- 时间复杂度:O(M*log(N)) (N是有序集合中的元素个数,M是被移除的元素个数)
- 命令参数:ZREM key member [member …]
- 操作类型:sorted sets
- 官方文档
作用
移除有序列表中的元素,当版本大于等于2.4时,可以一次性移除多个元素,返回成功移除的元素个数,当指定的元素不存在时不会有任何操作。
练习
向有序集合中添加多个元素,然后使用 ZREM 命令移除部分元素:
127.0.0.1:6379> DEL zset (integer) 1 127.0.0.1:6379> ZADD zset 99 albert 98 tom (integer) 2 127.0.0.1:6379> ZADD zset 95 lili 96 liming (integer) 2 127.0.0.1:6379> ZADD zset 90 bella 60 dufu (integer) 2 127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES 1) "dufu" 2) "60" 3) "bella" 4) "90" 5) "lili" 6) "95" 7) "liming" 8) "96" 9) "tom" 10) "98" 11) "albert" 12) "99" 127.0.0.1:6379> ZREM zset libai dufu liming (integer) 2 127.0.0.1:6379> ZREM zset tom (integer) 1 127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES 1) "bella" 2) "90" 3) "lili" 4) "95" 5) "albert" 6) "99" 127.0.0.1:6379>
复制
ZRANGEBYLEX
- 最早出现版本:2.8.9
- 时间复杂度:O(log(N)+M) (N是有序集合中的元素个数,M是返回结果中元素的个数)
- 命令参数:ZRANGEBYLEX key min max [LIMIT offset count]
- 操作类型:sorted sets
- 官方文档
作用
按照字典序返回指定范围内的元素。当有序集合中所有元素的分数相同时返回指定字典序范围内的元素,当分数不同时结果未定义,不保证是惟一的。
字符串大小的比较,默认从小到大,类似于使用 memcmp
函数来比较,可以使用 LIMIT 选项,类似于 SQL 语句中的 limit 关键字用法,参数 count 也可以指定一个负数,表示从 offset 到最后的元素都作为结果返回。
指定范围的开始和结束时必须以 ( 或 [ 作为开头,( 表示开区间,[ 表示闭区间,+ 和 - 在这个命令中有着特殊含义,- 表示负无穷, + 表示正无穷, 如果有序集合中所有的元素分数都一样,那么 ZRANGEBYLEX zset - +
会返回所有的元素。
字符串会被当成二进制数组比较,所以在指定了ASCII字符集的状况下,对于全是ASCII范围内的字符可以正常比较,但是一些其他的字符集,比如utf8的字符比较起来可能会有问题,我们可以给字符分个段,前一段用来排序,后一段保存实际的元素内容来解决这个问题。
练习
向有序集合中添加多个元素,然后使用 ZRANGEBYLEX 命令返回指定范围内的元素,先看下分数不同的情况:
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES 1) "bella" 2) "90" 3) "lili" 4) "95" 5) "albert" 6) "99" 127.0.0.1:6379> ZRANGEBYLEX zset a + (error) ERR min or max not valid string range item 127.0.0.1:6379> ZRANGEBYLEX zset (a + 1) "bella" 2) "lili" 3) "albert" 127.0.0.1:6379>
复制
测试下元素分数相同的情况:
127.0.0.1:6379> DEL zset (integer) 1 127.0.0.1:6379> ZADD zset 1 albert 1 bella 1 tom 1 lili (integer) 4 127.0.0.1:6379> ZADD zset 1 dufu 1 libai 1 zhangqian 1 meihuo (integer) 4 127.0.0.1:6379> ZADD zset 1 hanwudi 1 liuche (integer) 2 127.0.0.1:6379> ZRANGE zset 0 -1 1) "albert" 2) "bella" 3) "dufu" 4) "hanwudi" 5) "libai" 6) "lili" 7) "liuche" 8) "meihuo" 9) "tom" 10) "zhangqian" 127.0.0.1:6379> ZRANGEBYLEX zset - + 1) "albert" 2) "bella" 3) "dufu" 4) "hanwudi" 5) "libai" 6) "lili" 7) "liuche" 8) "meihuo" 9) "tom" 10) "zhangqian" 127.0.0.1:6379> ZRANGEBYLEX zset (b (z 1) "bella" 2) "dufu" 3) "hanwudi" 4) "libai" 5) "lili" 6) "liuche" 7) "meihuo" 8) "tom" 127.0.0.1:6379> ZRANGEBYLEX zset (b (z LIMIT 3 3 1) "libai" 2) "lili" 3) "liuche" 127.0.0.1:6379>
复制
总结
- ZREVRANK 命令可以查询有序集合中指定元素的排名,按分数降序排列,如果指定的元素不存在返回nil。
- ZREM 命令可以删除有序集合中的元素,返回成功删除的元素个数。
- ZRANGEBYLEX 命令可以按照字典序返回指定范围内的元素,但前提是元素的分数相同。
2020-1-12 22:50:38