Redis 集合排序
排序主要针对的是集合操作,即List、Set、ZSet这三种集合。
排序操作主要依赖于如下几个命令
sort、by、get、limit
排序使用建议:
(1).对较大数据量进行排序会影响性能
(2).如必须对大数据量排序,建议使用Store参数来缓存结果
(3).尽量使用limit限制获取的数据量
集合排序
返回或保存给定列表、集合、有序集合 key 中经过排序的元素,默认是升序
语法:
sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
1.一般sort排序
127.0.0.1:6379> lpush intlist 9 0 78 98 2 34 1 8
(integer) 8
127.0.0.1:6379> lrange intlist 0 -1
1) "8"
2) "1"
3) "34"
4) "2"
5) "98"
6) "78"
7) "0"
8) "9"
127.0.0.1:6379> sort intlist # 升序
1) "0"
2) "1"
3) "2"
4) "8"
5) "9"
6) "34"
7) "78"
8) "98"
127.0.0.1:6379> sort intlist desc # 降序
1) "98"
2) "78"
3) "34"
4) "9"
5) "8"
6) "2"
7) "1"
8) "0"
2.使用 ALPHA 修饰符对字符串进行排序
127.0.0.1:6379> lpush stringlist “oracle” “mysql” “sqlserver” “redis” “mongodb”
(integer) 5
127.0.0.1:6379> lrange stringlist 0 -1
1) “mongodb”
2) “redis”
3) “sqlserver”
4) “mysql”
5) “oracle”
127.0.0.1:6379> sort stringlist alpha
1) “mongodb”
2) “mysql”
3) “oracle”
4) “redis”
5) “sqlserver”
127.0.0.1:6379> sort stringlist alpha desc
1) “sqlserver”
2) “redis”
3) “oracle”
4) “mysql”
5) “mongodb”
3.使用 limit 修饰符限制返回结果
排序之后返回元素的数量可以通过 LIMIT 修饰符进行限制, 修饰符接受 offset 和 count 两个参数:
● offset 指定要跳过的元素数量。
● count 指定跳过 offset 个指定的元素之后,要返回多少个对象。
127.0.0.1:6379> sort stringlist alpha
1) "mongodb"
2) "mysql"
3) "oracle"
4) "redis"
5) "sqlserver"
127.0.0.1:6379> sort stringlist alpha limit 1 3
1) "mysql"
2) "oracle"
3) "redis"
127.0.0.1:6379> sort stringlist alpha limit 2 3
1) "oracle"
2) "redis"
3) "sqlserver"
4.使用外部 key 进行排序
可以使用外部 key 的数据作为权重,代替默认的直接对比键值的方式来进行排序
假设用户信息表中有如下数据
uid | user_name_{udi} | user_level_{uid} |
---|---|---|
1 | admin | 9999 |
2 | jack | 10 |
3 | peter | 25 |
4 | mary | 70 |
将上面的数据输入到Redis中
# admin
127.0.0.1:6379> lpush uid 1
(integer) 1
127.0.0.1:6379> set user_name_1 admin
OK
127.0.0.1:6379> set user_level_1 9999
OK# jack
127.0.0.1:6379> lpush uid 2
(integer) 2
127.0.0.1:6379> set user_name_2 jack
OK
127.0.0.1:6379> set user_level_2 10
OK# peter
127.0.0.1:6379> lpush uid 3
(integer) 3
127.0.0.1:6379> set user_name_3 peter
OK
127.0.0.1:6379> set user_level_3 25
OK# tom
127.0.0.1:6379> lpush uid 4
(integer) 1
127.0.0.1:6379> set user_name_4 mary
OK
127.0.0.1:6379> set user_level_4 70
OK
- by选项
默认情况下sort uid,直接按照uid的值进行排序
127.0.0.1:6379> sort uid
1) "1"
2) "2"
3) "3"
4) "4"
使用by选项,让uid键按照user_level_{uid}的值大小来排序
127.0.0.1:6379> sort uid by user_level_*
1) "2"
2) "3"
3) "4"
4) "1"
user_level_* 是一个占位符, 它先取出 uid 中的值, 然后再用这个值来查找相应的键比如在对 uid 列表进行排序时, 程序就会先取出 uid 的值 1 、 2 、 3 、 4 , 然后使用 user_level_1 、 user_level_2 、 user_level_3 和 user_level_4 的值作为排序 uid 的权重
- get 选项
使用 GET 选项, 可以根据排序的结果来取出相应的键值
比如:先排序 uid , 再取出键 user_name_{uid} 的值
127.0.0.1:6379> sort uid get user_name_*
1) "admin"
2) "jack"
3) "peter"
4) "mary"
- 组合使用 by 和 get 选项
通过组合使用 BY 和 GET , 可以让排序结果以更直观的方式显示出来
比如:先按 user_level_{uid} 来排序 uid 列表, 再取出相应的 user_name_{uid} 的值
127.0.0.1:6379> sort uid by user_level_* get user_name_*
1) "jack"
2) "peter"
3) "mary"
4) "admin"
可以同时使用多个 GET 选项, 获取多个外部键的值,同时获取user_name_{uid} 和 user_level_{uid}
127.0.0.1:6379> sort uid by user_level_* get user_name_* get user_level_*
1) "jack"
2) "10"
3) "peter"
4) "25"
5) "mary"
6) "70"
7) "admin"
8) "9999"
GET 有一个额外的参数规则,那就是 —— 可以用 # 获取被排序键的值
比如:将 uid 的值、及其相应的 user_level_* 和 user_name_* 都返回
127.0.0.1:6379> sort uid get # get user_level_* get user_name_*1) "1"2) "9999"3) "admin"4) "2"5) "10"6) "jack"7) "3"8) "25"9) "peter"
10) "4"
11) "70"
12) "mary"
5.获取外部键,但不进行排序
通过将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作, 直接返回结果
127.0.0.1:6379> lrange uid 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> sort uid by not-exists-key
1) "4"
2) "3"
3) "2"
4) "1"
上面的用法在单独使用时,没什么实际用处。不过,通过将这种用法和 GET 选项配合, 就可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于 SQL 数据库的 join 关键字)。
比如:在不引起排序的情况下,使用 SORT 、 BY 和 GET 获取多个外部键(user_level_{uid}和user_name_{uid})
127.0.0.1:6379> sort uid by not-exists-key get # get user_level_* get user_name_*1) "4"2) "70"3) "mary"4) "3"5) "25"6) "peter"7) "2"8) "10"9) "jack"
10) "1"
11) "9999"
12) "admin"
6.将哈希表作为 GET 或 BY 的参数
除了字符串键之外, 哈希表也可以作为 GET 或 BY 选项的参数来使用。
仍然使用上述的用户信息表,将用户的名字和级别保存在 user_name_{uid} 和 user_level_{uid} 两个字符串键中(用一个带有 name 域和 level 域的哈希表 user_info_{uid} 来保存用户的名字和级别信息)
127.0.0.1:6379> hmset user_info_1 name admin level 9999
OK
127.0.0.1:6379> hmset user_info_2 name jack level 10
OK
127.0.0.1:6379> hmset user_info_3 name peter level 25
OK
127.0.0.1:6379> hmset user_info_4 name mary level 70
OK
然后, BY 和 GET 选项都可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域
127.0.0.1:6379> sort uid by user_info_*->level
1) "2"
2) "3"
3) "4"
4) "1"
127.0.0.1:6379> sort uid by user_info_*->level get user_info_*->name
1) "jack"
2) "peter"
3) "mary"
4) "admin"
同样可以同时使用多个 GET 选项, 获取多个外部键的值,同时获取user_name_{uid} 和 user_level_{uid}
127.0.0.1:6379> sort uid by user_info_*->level get user_info_*->level get user_info_*->name
1) "10"
2) "jack"
3) "25"
4) "peter"
5) "70"
6) "mary"
7) "9999"
8) "admin"
默认升序,我们也可以倒序
127.0.0.1:6379> sort uid desc by user_info_*->level get user_info_*->level get user_info_*->name
1) "9999"
2) "admin"
3) "70"
4) "mary"
5) "25"
6) "peter"
7) "10"
8) "jack"
7.保存排序结果
默认情况下, SORT 操作只是简单地返回排序结果,并不进行任何保存操作。
通过给 STORE 选项指定一个 key 参数,可以将排序结果保存到给定的键上。
如果被指定的 key 已存在,那么原有的值将被排序结果覆盖。
# 测试数据
127.0.0.1:6379> rpush numbers 1 3 5 7 9
(integer) 5
127.0.0.1:6379> rpush numbers 2 4 6 8 10
(integer) 10
127.0.0.1:6379> lrange numbers 0 -11) "1"2) "3"3) "5"4) "7"5) "9"6) "2"7) "4"8) "6"9) "8"
10) "10"
# 排序并保存排序后的结果
127.0.0.1:6379> sort numbers store sorted-numbers
(integer) 10
127.0.0.1:6379> lrange sorted-numbers 0 -11) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9"
10) "10"
可以通过将 SORT 命令的执行结果保存,并用 EXPIRE 为结果设置生存时间,以此来产生一个 SORT 操作的结果缓存。
这样就可以避免对 SORT 操作的频繁调用:只有当结果集过期时,才需要再调用一次 SORT 操作。
另外,为了正确实现这一用法,可能需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行 SORT 操作,并保存为结果集),具体参见 SETNX 命令。
Redis 集合排序相关推荐
- 列表/集合排序与Redis事务
目录 集合排序 按权重进行排序 Redis事务 Redis事务和关系型数据库事务区别 排序重要性毋庸置疑,基本上大家看的算法书,编程语言书都会讲到各种各样的排序算法,现在基本上都有封装好的排序算法工具 ...
- Redis 命令--Redis集合(Set)
Redis集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找的 ...
- Redis 集合(Set)
Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度 ...
- java怎么给list集合排序_java list集合排序按某一属性排序操作
我就废话不多说了,大家还是直接看代码吧~ public List sortList(List list){ Collections.sort(list, new Comparator(){ @Over ...
- 【Java基础篇】集合排序
所谓集合排序是指对集合内的元素进行排序. 集合工具类Collections中提供了两种排序算法,分别是: Collections.sort(List list) Collections.sort(Li ...
- Redis学习---(10)Redis 集合(Set)
Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ...
- redis linux 删除数据结构,Redis集合数据结构和常用命令
Redis 的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来存储和查找数据,理论上一个集合可以存储 2 的 32 次方减 1 个节点(大约 42 亿)个元素,因为采用哈希表 ...
- java8新特性:对map集合排序
一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...
- java 集合排序方法_java集合排序方法sort的使用
转自 http://blog.csdn.net/a1165117473/article/details/6965652 /* * To change this template, choose To ...
- 写了一个对象集合排序的类
写了一个对象集合排序的类 废话不多说,首先是定义一个对象实体类 class Entity { public Entity() {} pr ...
最新文章
- onethink php7.1,海豚PHP开发框架下载
- SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
- 内核模式下的字符串操作
- Linux安装配置Java1.8开发环境
- 大型的labview程序实例_【学院推荐】LabVIEW的核心要素——数据流
- 使用parted给大于2T的磁盘分区
- python运维监控脚本_Python实现数通设备端口使用情况监控实例
- 【POJ】2296 Map Labeler
- wr885n虚拟服务器设置,动态IP设置:选择动态IP(以太网宽带
- hibernate 基本步骤 一
- 好用的在线 java 编译网站,编辑器(亲测)
- 计算机主机有gpib接口吗,PC104模块与通用并行接口(GPIB)通讯的实现
- php 数字转人民币,php数字转人民币金额大写
- ubuntu测试键盘工具_Lubuntu安装屏幕键盘onboard,使触摸屏可以登录和输入
- ONF组织的SDN架构文档——四个架构(三/一)
- 电动汽车充电桩中的漏电保护应用分析 RCD的分类和选型
- Windows 11强势来袭,一文带你了解全部更新内容
- 损失函数——均方误差(Mean Squared Error,MSE)
- 几个按照下载次数就可以赚钱的网盘介绍
- Linux查看pcie槽位
热门文章
- 世界各地区5G信道一览表[转载,仅作保存使用]
- Express访问静态资源(express.static)
- netlogo-入门-学习记录
- grandMA2onPC控制UE4灯光
- rk3568 LTE(N720)
- SQL Server2008详细安装步骤(超详细步骤)
- 软件测试打电话,如何有效测试手机通话测试 - fox的测试人生 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 计算机控制系统编程语言,可编程控制器常用的几种编程语言
- 微信小程序开发(3.选项卡)
- biopython安装_Ubuntu中安装Biopython