版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 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