暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(36):ZREVRANK、ZREM和ZRANGEBYLEX命令

原创 AlbertS 2020-01-14
2285

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

今天一共有三个命令需要学习,前两个命令很简单,基本看名字就能明白,反向排序和元素移除,主要是第3个命令比较麻烦,返回指定返回内的元素,这个命令的参数比较奇怪,我们一起来看一下。

这篇笔记中的3个命令分别是 ZREVRANK 、 ZREM 、 ZRANGBYLEX ,可以参考:

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>

总结

  1. ZREVRANK 命令可以查询有序集合中指定元素的排名,按分数降序排列,如果指定的元素不存在返回nil。
  2. ZREM 命令可以删除有序集合中的元素,返回成功删除的元素个数。
  3. ZRANGEBYLEX 命令可以按照字典序返回指定范围内的元素,但前提是元素的分数相同。

2020-1-12 22:50:38

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论