排序主要针对的是集合操作,即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 集合排序相关推荐

  1. 列表/集合排序与Redis事务

    目录 集合排序 按权重进行排序 Redis事务 Redis事务和关系型数据库事务区别 排序重要性毋庸置疑,基本上大家看的算法书,编程语言书都会讲到各种各样的排序算法,现在基本上都有封装好的排序算法工具 ...

  2. Redis 命令--Redis集合(Set)

    Redis集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找的 ...

  3. Redis 集合(Set)

    Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度 ...

  4. java怎么给list集合排序_java list集合排序按某一属性排序操作

    我就废话不多说了,大家还是直接看代码吧~ public List sortList(List list){ Collections.sort(list, new Comparator(){ @Over ...

  5. 【Java基础篇】集合排序

    所谓集合排序是指对集合内的元素进行排序. 集合工具类Collections中提供了两种排序算法,分别是: Collections.sort(List list) Collections.sort(Li ...

  6. Redis学习---(10)Redis 集合(Set)

    Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ...

  7. redis linux 删除数据结构,Redis集合数据结构和常用命令

    Redis 的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来存储和查找数据,理论上一个集合可以存储 2 的 32 次方减 1 个节点(大约 42 亿)个元素,因为采用哈希表 ...

  8. java8新特性:对map集合排序

    一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...

  9. java 集合排序方法_java集合排序方法sort的使用

    转自  http://blog.csdn.net/a1165117473/article/details/6965652 /* * To change this template, choose To ...

  10. 写了一个对象集合排序的类

    写了一个对象集合排序的类 废话不多说,首先是定义一个对象实体类     class Entity     {         public Entity()         {}         pr ...

最新文章

  1. onethink php7.1,海豚PHP开发框架下载
  2. SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
  3. 内核模式下的字符串操作
  4. Linux安装配置Java1.8开发环境
  5. 大型的labview程序实例_【学院推荐】LabVIEW的核心要素——数据流
  6. 使用parted给大于2T的磁盘分区
  7. python运维监控脚本_Python实现数通设备端口使用情况监控实例
  8. 【POJ】2296 Map Labeler
  9. wr885n虚拟服务器设置,动态IP设置:选择动态IP(以太网宽带
  10. hibernate 基本步骤 一
  11. 好用的在线 java 编译网站,编辑器(亲测)
  12. 计算机主机有gpib接口吗,PC104模块与通用并行接口(GPIB)通讯的实现
  13. php 数字转人民币,php数字转人民币金额大写
  14. ubuntu测试键盘工具_Lubuntu安装屏幕键盘onboard,使触摸屏可以登录和输入
  15. ONF组织的SDN架构文档——四个架构(三/一)
  16. 电动汽车充电桩中的漏电保护应用分析 RCD的分类和选型
  17. Windows 11强势来袭,一文带你了解全部更新内容
  18. 损失函数——均方误差(Mean Squared Error,MSE)
  19. 几个按照下载次数就可以赚钱的网盘介绍
  20. Linux查看pcie槽位

热门文章

  1. 世界各地区5G信道一览表[转载,仅作保存使用]
  2. Express访问静态资源(express.static)
  3. netlogo-入门-学习记录
  4. grandMA2onPC控制UE4灯光
  5. rk3568 LTE(N720)
  6. SQL Server2008详细安装步骤(超详细步骤)
  7. 软件测试打电话,如何有效测试手机通话测试 - fox的测试人生 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  8. 计算机控制系统编程语言,可编程控制器常用的几种编程语言
  9. 微信小程序开发(3.选项卡)
  10. biopython安装_Ubuntu中安装Biopython