博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZRANGEBYLEX key min max [LIMIT offset count]
阅读量:6220 次
发布时间:2019-06-21

本文共 3189 字,大约阅读时间需要 10 分钟。

1 简介

ZRANGEBYLEX 返回指定成员区间内的成员,按成员字典正序排序, 分数必须相同。 在某些业务场景中,需要对一个字符串数组按名称的字典顺序进行排序时,可以使用Redis中SortSet这种数据结构来处理。

2 语法

2.1 完整示例

ZRANGEBYLEX key min max [LIMIT offset count]

2.2 说明

指令 是否必须 说明
ZRANGEBYLEX 指令
key 有序集合键名称
min 字典中排序位置较小的成员,必须以"["开头,或者以"("开头,可使用"-"代替
max 字典中排序位置较大的成员,必须以"["开头,或者以"("开头,可使用"+"代替
LIMIT 返回结果是否分页,指令中包含LIMIT后offset、count必须输入
offset 返回结果起始位置
count 返回结果数量

提示:

  • 分数必须相同! 如果有序集合中的成员分数有不一致的,返回的结果就不准。
  • 成员字符串作为二进制数组的字节数进行比较。
  • 默认是以ASCII字符集的顺序进行排列。如果成员字符串包含utf-8这类字符集的内容,就会影响返回结果,所以建议不要使用。
  • 默认情况下, “max” 和 “min” 参数前必须加 “[” 符号作为开头。”[” 符号与成员之间不能有空格, 返回成员结果集会包含参数 “min” 和 “max” 。
  • “max” 和 “min” 参数前可以加 “(“ 符号作为开头表示小于, “(“ 符号与成员之间不能有空格。返回成员结果集不会包含 “max” 和 “min” 成员。
  • 可以使用 “-“ 和 “+” 表示得分最小值和最大值
  • “min” 和 “max” 不能反, “max” 放前面 “min”放后面会导致返回结果为空
  • 与ZRANGEBYLEX获取顺序相反的指令是ZREVRANGEBYLEX
  • 源码中采用C语言中 memcmp() 函数, 从字符的第0位到最后一位进行排序,如果前面部分相同,那么较长的字符串比较短的字符串排序靠后。

3 返回值

指定成员范围的元素列表。

4 示例

不要在分数不一致的SortSet集合中去使用 ZRANGEBYLEX 指令,因为获取的结果并不准确。

4.1 获取所有值

可以使用 “-“ 和 “+” 表示得分最小值和最大值

redis> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1(integer) 12redis> ZRANGEBYLEX zset - + 1) "a" 2) "aa" 3) "abc" 4) "apple" 5) "b" 6) "c" 7) "d" 8) "d1" 9) "dd"10) "dobble"11) "z"12) "z1"

4.2 获取分页数据

redis> ZRANGEBYLEX zset - + LIMIT 0 31) "a"2) "aa"3) "abc"redis> ZRANGEBYLEX zset - + LIMIT 3 31) "apple"2) "b"3) "c"

4.3 获取成员之间的元素

默认情况下, “max” 和 “min” 参数前必须加 “[” 符号作为开头。

“[” 符号与成员之间不能有空格, 返回成员结果集会包含参数 “min” 和 “max” 。

redis> ZRANGEBYLEX zset [aa [c1) "aa"2) "abc"3) "apple"4) "b"5) "c"

“min” 和 “max” 不能反, “max” 放前面 “min”放后面会导致返回结果为空

redis> ZRANGEBYLEX zset [c [aa(empty list or set)

4.4 使用 “(“ 小于号获取成员之间的元素

“max” 和 “min” 参数前可以加 “(“ 符号作为开头表示小于, “(“ 符号与成员之间不能有空格。

返回成员结果集不会包含 “max” 和 “min” 成员。

redis> ZRANGEBYLEX zset [aa (c1) "aa"2) "abc"3) "apple"4) "b"

4.5 ASCII码的影响

成员字符串作为二进制数组的字节数进行比较。

默认是以ASCII字符集的顺序进行排列。
如果成员字符串包含utf-8这类字符集的内容,就会影响返回结果,所以建议不要使用。

redis> zadd zset 0 aBc(integer) 1redis> ZRANGEBYLEX zset - + 1) "a" 2) "aBc" 3) "aa" 4) "abc" 5) "apple" 6) "b" 7) "c" 8) "d" 9) "d1"10) "dd"11) "dobble"12) "z"13) "z1"redis> ZRANGEBYLEX zset - + LIMIT 0 31) "a"2) "aBc"3) "aa"

5 使用场景示例

5.1 电话号码排序

我们可以将电话号码存储到SortSet中,然后根据需要来获取号段:

redis> zadd phone 0 13100111100 0 13110114300 0 13132110901 (integer) 3redis> zadd phone 0 13200111100 0 13210414300 0 13252110901 (integer) 3redis> zadd phone 0 13300111100 0 13310414300 0 13352110901 (integer) 3

获取所有号码:

redis> ZRANGEBYLEX phone - +1) "13100111100"2) "13110114300"3) "13132110901"4) "13200111100"5) "13210414300"6) "13252110901"7) "13300111100"8) "13310414300"9) "13352110901"

获取132号段:

redis> ZRANGEBYLEX phone [132 (1331) "13200111100"2) "13210414300"3) "13252110901"

获取132、133号段:

redis> ZRANGEBYLEX phone [132 (1341) "13200111100"2) "13210414300"3) "13252110901"4) "13300111100"5) "13310414300"6) "13352110901"

5.2 姓名排序

将名称存储到SortSet中:

redis> zadd names 0 Toumas 0 Jake 0 Bluetuo 0 Gaodeng 0 Aimini 0 Aidehua (integer) 6

获取所有人的名字:

redis> ZRANGEBYLEX names - +1) "Aidehua"2) "Aimini"3) "Bluetuo"4) "Gaodeng"5) "Jake"6) "Toumas"

获取名字中大写字母A开头的所有人:

redis> ZRANGEBYLEX names [A (B1) "Aidehua"2) "Aimini"

获取名字中大写字母C到Z的所有人:

redis> ZRANGEBYLEX names [C [Z1) "Gaodeng"2) "Jake"3) "Toumas"
本文作者:陈群
本文来自云栖社区合作伙伴rediscn,了解相关信息可以关注redis.cn网站。

转载地址:http://jalja.baihongyu.com/

你可能感兴趣的文章
《PostgreSQL服务器编程》一一2.2 开发者的可用性
查看>>
通过增加代码覆盖率提高单元测试的质量
查看>>
大数据时代新闻生产的新变分析
查看>>
国家电网公司使用OpenStack降低IT成本 避免被厂商锁定
查看>>
性能测试流程各阶段的工作
查看>>
美国国家情报总监手机和个人电邮被黑
查看>>
遂宁让“智慧城市”融入绿色经济发张
查看>>
智慧城市发展物流产业仓储机器人推动力
查看>>
淘宝bug管理系统
查看>>
重新配置OpenFire数据库
查看>>
《高性能科学与工程计算》——1.6 向量处理器
查看>>
《高可用架构·中国初创故事(第3期)》一1.3 不愿透露信息
查看>>
《NX-OS与Cisco Nexus交换技术:下一代数据中心架构(第2版)》一导读
查看>>
《超越平凡的平面设计:怎样做好版式(第1卷)》—第1章1.1节 如何设计新闻简报...
查看>>
安卓应用漏洞检查工具 QARK
查看>>
《MATLAB/Simulink系统仿真超级学习手册》——1.2 MATLAB简介
查看>>
阿里巴巴向 Apache 基金会捐赠移动开发框架 Weex
查看>>
《数据结构与算法 C语言版》—— 1.1数据结构的研究对象
查看>>
商用市场发力,Chromebook 销量超 Mac
查看>>
《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——1.12节复习题
查看>>