文档章节

Redis sort命令详解

九州暮云
 九州暮云
发布于 2016/10/13 15:51
字数 774
阅读 73
收藏 0

redis的sort命令,可能算得上redis里面最复杂的一个命令了,命令原型如下:

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

如果不仔细看文档,或者看源码,一下子真的不知道这个命令怎么用。首先我们可以去掉LIMIT offset count这个选项,这个很容易理解,就是排好序之后取偏移数据。ASC和DESC这个也比较容易,就是正向和逆向排序。STORE destination这个其实就是将排好序的数据放到destination这个list里面,也比较容易理解。好了,去掉这些,那么sort的原型就是这个样子了:

SORT key [BY pattern] [GET pattern [GET pattern ...]] [ALPHA]

key里面存储的就是需要排序的东西,所以key只能是list,set或者zset类型,我们以list为例。假设做如下操作:

redis> lpush a 1 2 3
redis> lrange a 0 -1
1) "3"
2) "2"
3) "1"

如果使用sort,则排序结果如下:

redis> sort a
1) "1"
2) "2"
3) "3"

那么ALPHA是什么意思呢?我们可以做如下操作解释:

redis> lpush b a1 a2 a3
redis> sort b
(error) ERR One or more scores can't be converted into double
redis> sort b alpha
1) "a1"
2) "a2"
3) "a3"

我们在b里面压入的是字符串,所以不能直接sort,必须指定alpha方式。所以alpha就是明确告知sort使用字节序排序,不然sort就会尝试将需要排序的数据转成double类型。

理解了alpha,我们再来看看by的含义,如下例子:

redis> set w_1 30
redis> set w_2 20
redis> set w_3 10
redis> sort a by w_*
1) "3"
2) "2"
3) "1"
127.0.0.1:6379>

如果有by了,sort就会首先取出对应的数据,也就是1,2,3,然后跟by的pattern进行组合,变成w_1,w_2,w_3,然后以这个作为key去获取对应的值,也就是30,20,10,再按照这些值进行排序。上面这个例子,1对应的by值最大,为30,所以升序排列的时候在最后。

说完了by,我们再来说说get,get是不参与排序的,只是在排完序之后,将排好序的值依次跟get的pattern组合,获取对应的数据,进行返回,如下例子:

redis> set o_1 10
redis> set o_2 20
redis> set o_3 30
redis> sort a get o_*
1) "10"
2) "20"
3) "30"

再来一个多个get的例子:

redis> set oo_1 100
redis> set oo_2 200
redis> set oo_3 300
redis> sort a get o_* get oo_*
1) "10"
2) "100"
3) "20"
4) "200"
5) "30"
6) "300"

从上面可以看到,如果有多个get,那么sort的做法是对于排好序的一个值,依次通过get获取值,放到结果中,然再处理下一个值。

如果有get,我们就能获取到相关的值,但这时候我们还需要返回原有的值怎么办?只需要get #就成了,如下:

redis> sort a get o_* get #
1) "10"
2) "1"
3) "20"
4) "2"
5) "30"
6) "3"

本文转载自:http://www.jianshu.com/p/9635b29e69b7

九州暮云
粉丝 71
博文 161
码字总数 119036
作品 0
海淀
高级程序员
私信 提问
PHP操作Redis详解案例

$redis = new Redis(); connect, open 链接redis服务 参数 host: string,服务地址 port: int,端口号 timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间) 注: 在redis.conf中也有时间...

思梦教育
2017/12/30
0
0
redis学习笔记---redis特性(expire、事务、数据排序、config命令)

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

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

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

Siddon's Blog
2015/02/10
0
0
SHELL利器:比较常用的SHELL命令(持续更新)

awk,说shell中的瑞士军刀不为过吧 # 实现SQL中的group by功能,例如对“姓名 地点 年龄”按照地点字段统计其年龄之和awk '{arr[$2]+=$3} END{for(i in arr) print i,arr[i]}' source_file.t...

Iuranus
2014/06/23
371
2
关于阿里云部署安装Redis服务

最近在linux服务器上需要安装redis,来存放数据,增加用户访问数据的速度,由于是第一次安装,顺利安装好了,方便以后使用,也为需要的朋友提供一个方便。 安装: 1.获取redis资源   wget ...

吴志国
02/26
955
2

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
42
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部