SORT命令
sort命令可以对列表类型、集合类型和有序集合类型键进行排序,并且可以完成与关系型数据库中连接查询相类似的任务。
sort key [DESC][ALPHA] [limit offset count ]
1. 如果没有加上ALPHA参数的话,sort命令会尝试将所有元素转为双精度浮点数来比较,如果无法转换则会提示错误。
2. DESC 命令sort默认按照从小到大的顺序排列,加上desc按照从大到小的顺序排列
3. limit offset count 获取从索引offset开始的count个元素
BY参数语法
by命令搭配sort命令使用,语法是 BY 参考键
其中参考键可以是字符串类型键或者是散列类型键的某个字段(表示为键名->字段名)。如果提供了BY参数,sort
命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个*并获取其值,然后根据该值对元素进行排序。
1>by后面是散列类型
SORT mykey BY post:*->time desc;
取键mykey的值替换* ,就是post:值,获取键post:值的值进行倒序排列。
2>by后面是字符串类型
SORT mykey by post:* desc;
note:1. 如果by后面的参考键名没有包含*,sort命令将不会执行排序操作
2. 如果几个元素的参考键值相同,则sort命令会在比较元素本身的值来决定元素的顺序。
3. 当某个元素的参考键不存在时,会默认参考键的值为0
4. 参考键虽然支持散列类型,但是*只能出现在->符号的前面,出现在后面redis不会认为是常量键名,结果还是按照元素大小进行排序,这个比较特殊
GET 参数
SORT命令的get参数,不影响排序,作用是使sort命令的返回结果不再是元素自身的值,而是get参数指定的键值,get参数的规则和by参数的规则一样,get参数也支持字符串类型和散列类型的键,并使用*作为占位符。要实现在排序后直接返回Id对应的文章标题。
实现按照时间排序后直接返回Id对应的文章标题
sort tag:ruby:posts by posts:->time desc get posts:*->title
1> 一个sort命令中可以有多个get参数(而by参数只能有一个)
sort tag:ruby:posts by post:* -> time desc get post:*->title get post:*->time
2> 如果有n个get参数,每个元素返回的结果就有N行,get #返回的是元素本身,就是上面例子中
键 tag:ruby:posts 的 元素
sort tag:ruby:posts by post:*->time desc get post:*->title get #
STORE参数
默认情况下sort会直接返回排序结果,如果希望将排序后的结果保存,可以使用store参数,如将结果保存到sort.result键中
,直接在sort命令的后面加上sort 键 名,并且有键的类型会是列表类型,如果键已经存在则会覆盖它,加上store参数后,sort命令的返回值为结果的个数
sort tag:ruby:posts by post:*->time desc get post:*->title store sort.result
性能优化
sort命令的事件复杂度是O(n+mlog(m)),其中n表示要排序的列表(集合或者有序集合中元素的个数),m表示要返回的元素个数。
当n较大时候sort命令的性能相对较低,并且redis在排序前会建立一个长度为n的容器来存储待排序的元素。
sort命令使用注意:
1> 尽可能减少待排序键中元素的数据量 (使n尽可能小)
2>使用limit参数获取需要的数据 (使m尽可能小)
3>如果要排序的数据量大,可以使用store参数缓存结果,便于再次使用