文档章节

Redis的排序命令使用(Sort)

Andy-xu
 Andy-xu
发布于 09/12 10:16
字数 1391
阅读 25
收藏 1

sort排序的用法

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

用来返回或保存给定列表集合有序集合中经过排序的元素。

注意:sort 默认使用数字进行排序,如果是字符串需要加ALPHA参数,否则会报错

普通排序

简单的排序方式:

  • sort key 按照key进行升序排序
  • sort key desc 按照key进行降序排序
# 构造一个list
127.0.0.1:6379> LPUSH day 2 1 3 52 4 9 7 5 8
(integer) 9

# 查看list元素
127.0.0.1:6379> LRANGE day 0 -1
1) "8"
2) "5"
3) "7"
4) "9"
5) "4"
6) "52"
7) "3"
8) "1"
9) "2"

127.0.0.1:6379> SORT day
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "8"
8) "9"
9) "52"
127.0.0.1:6379> SORT day desc
1) "52"
2) "9"
3) "8"
4) "7"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"

使用ALPHA修饰符对字符串进行排序

sort默认使用数据进行排序,如果value是字符串,需要再key后面增加alpha参数。

127.0.0.1:6379> LPUSH testkey biao afada terna martin
(integer) 4

127.0.0.1:6379> SORT testkey
(error) ERR One or more scores can't be converted into double

127.0.0.1:6379> SORT testkey alpha
1) "afada"
2) "biao"
3) "martin"
4) "terna"

注意:如果linux设置了LC_COLLATE环境,可以自动识别UTF-8

使用limit限制返回结果

limit可以接受两个参数:

  • offset 指定要跳过的元素数量
  • count 指定跳过 offset 个指定的元素之后,要返回多少个对象
127.0.0.1:6379> SORT testkey alpha limit  0 1
1) "afada"
127.0.0.1:6379> SORT testkey alpha limit  1 1
1) "biao"

使用外部key进行排序

可以使用外部key 的数据作为权重代替默认的直接对比键值的方式来进行排序。

假设用户数据可以分为三列:uid、user_name_{uid}、user_day_{uid}

127.0.0.1:6379> LPUSH uid 1
(integer) 1
127.0.0.1:6379> LPUSH uid 2
(integer) 2
127.0.0.1:6379> LPUSH uid 3
(integer) 3
127.0.0.1:6379> LPUSH uid 4
(integer) 4
127.0.0.1:6379> set user_name_1 biao
OK
127.0.0.1:6379> set user_day_1 12
OK
127.0.0.1:6379> set user_name_2 bgbiao
OK
127.0.0.1:6379> set user_day_2 15
OK
127.0.0.1:6379> set user_name_3 xxbandy
OK
127.0.0.1:6379> set user_day_3  1
OK
127.0.0.1:6379> set user_name_4 bgops
OK
127.0.0.1:6379> set user_day_4 13
OK

uid user_name_{uid} user_day_{uid}
1 biao 12
2 bgbiao 15
3 xxbandy 1
4 bgops 13

使用BY参数

## 使用uid降序排序
127.0.0.1:6379> sort uid desc
1) "4"
2) "3"
3) "2"
4) "1"

## 使用user_day_{uid}的值进行排序,并获取对应uid
127.0.0.1:6379> sort uid by user_day_*
1) "3"
2) "1"
3) "4"
4) "2"

使用GET参数

## 使用uid降序排序
127.0.0.1:6379> sort uid desc
1) "4"
2) "3"
3) "2"
4) "1"
## 排序后获取指定的字段
127.0.0.1:6379> sort uid desc get user_name_*
1) "bgops"
2) "xxbandy"
3) "bgbiao"
4) "biao"

组合使用BY和GET参数


## 获取按照user_day_{uid}进行降序排序后的uid
127.0.0.1:6379> sort uid desc by user_day_*
1) "2"
2) "4"
3) "1"
4) "3"

## 按照指定的字段进行排序,并获取指定字段的数据
127.0.0.1:6379> sort uid desc by user_day_* get user_name_* get user_day_*
1) "bgbiao"
2) "15"
3) "bgops"
4) "13"
5) "biao"
6) "12"
7) "xxbandy"
8) "1"

注意:同时可以获取多个字段

获取外部键,但不进行排序

通过将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作.

127.0.0.1:6379> sort uid by abc
1) "4"
2) "3"
3) "2"
4) "1"

不过,通过将这种用法和 GET 选项配合, 就可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于 SQL 数据库的 join 关键字)

注意:GET #可以获取排序的外键

127.0.0.1:6379> sort uid by abc 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"

将哈希表作为get或by的参数

前面使用了字符串作为get和by的参数,哈希表也可以作为get和by的参数。

uid user_name_{uid} user_day_{uid}
1 biao 12
2 bgbiao 15
3 xxbandy 1
4 bgops 13

我们可以不将用户的名字和级别保存在 user_name_{uid} 和 user_day_{uid} 两个字符串键中, 而是用一个带有 name 域和 day 域的哈希表 user_info_{uid} 来保存用户的名字和天数

127.0.0.1:6379> HMSET user_info_1 name biao day 12
OK
127.0.0.1:6379> HMSET user_info_2 name bgbiao day 15
OK
127.0.0.1:6379> HMSET user_info_3 name xxbandy day 1
OK
127.0.0.1:6379> HMSET user_info_4 name bgops day 13
OK

注意:BY 和 GET 选项都可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域

## 按照day进行排序,并输出uid,day,name
127.0.0.1:6379> SORT uid BY user_info_*->day  get # get user_info_*->day get user_info_*->name
 1) "3"
 2) "1"
 3) "xxbandy"
 4) "1"
 5) "12"
 6) "biao"
 7) "4"
 8) "13"
 9) "bgops"
10) "2"
11) "15"
12) "bgbiao"

使用redigo模块进行获取排序参数

sortv, _ := redis.Strings(conn.Do("sort", "uid", "desc", "by", "user_day_*", "get", "user_name_*", "get", "user_day_*"))

fmt.Println(sortv)

## 输出结果
[bgbiao 15 bgops 13 biao 12 xxbandy 1]

保存排序结果

注意:默认sort仅用来排序,不会存储排序结果,可以使用STORE将结果存储到指定key中

127.0.0.1:6379> SORT uid BY user_info_*->day  get # get user_info_*->day get user_info_*->name STORE sortresults
(integer) 12

127.0.0.1:6379> type sortresults
list

127.0.0.1:6379> LRANGE sortresults 0 2
1) "3"
2) "1"
3) "xxbandy"

注意:通常可以使用sort进行排序存储到一个key后,使用expire进行结果的缓存,这样可以避免频繁的进行sort排序,仅在结果集过期后进行排序

欢迎关注我的公众号 Wechat.jpeg

© 著作权归作者所有

Andy-xu
粉丝 113
博文 105
码字总数 197073
作品 0
大兴
运维
私信 提问
redis学习笔记---redis特性(expire、事务、数据排序、config命令)

一、键的生存时间expire redis可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它 命令: ①expire 设置生存时间(单位/秒) expire a 10 ②pexpire 设置生存时间(单位/毫秒...

ivan-Zhao
2015/12/14
254
0
学习redis sort命令

学习redis sort命令 Siddon's Blog2015-02-10142 阅读 go LedisDB本来是没有sort命令的,而且实际我们也没有使用过该命令,但一位用户给我反应他迫切需要这个功能,我决定首先考察一下redis...

Siddon's Blog
2015/02/10
0
0
Redis sort命令详解

redis的sort命令,可能算得上redis里面最复杂的一个命令了,命令原型如下: 如果不仔细看文档,或者看源码,一下子真的不知道这个命令怎么用。首先我们可以去掉LIMIT offset count这个选项,...

丢失的羊羔
2016/10/13
73
0
redis学习笔记一

Redis启动 两个常用的redis启动命令 redis-server 即启动redis的服务器 redis-cli 启动redis自带的客户端 停止redis命令: redis-cli SHUTDOWN 相关命令 EXISTS bar 判断键值是否存在(返回值...

独特55
2016/03/04
46
0
Redis——排序

通过limit选项,可以让SORT命令返回其中一部分已排序的元素。 limit 选项的格式为limit <offset> <count>; offset 参数表示要跳过的已排序元素数量。 count 参数表示跳过给定数量的已排序元素...

nao
2016/05/27
30
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈prototype原型模式

一、原型模式简介 原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。 原型模式的特点: 1、由原型对...

青衣霓裳
15分钟前
6
0
shell mysql 备份

#!/bin/bash time2=$(date "+%Y-%m-%d-%H:%M:%S") /usr/local/mysql/bin/mysqldump -uroot -p ad > /usr/local/mysql/backup/"$time2".sql 变量引用原来是这么用的。......

奋斗的小牛
22分钟前
4
0
Jmeter监控Linux服务器操作

系统:Win7 64位 工具:Jmeter 4.0 要准备好的插件:JMeterPlugins-Standard-1.4.0,ServerAgent-2.2.1 解压JMeterPlugins-Standard-1.4.0.zip,将其中\lib\ext\JMeterPlugins-Standard.jar......

魔鬼妹子
23分钟前
5
0
系列文章:云原生Kubernetes日志落地方案

在Logging这块做了几年,最近1年来越来越多的同学来咨询如何为Kubernetes构建一个日志系统或者是来求助在这过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是想把我们这些年积累的经...

Mr_zebra
23分钟前
5
0
入门必备!快速学会用Aspose.Words在表格中插入和删除列!

Aspose.Words For .Net(点击下载)是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft W...

mnrssj
28分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部