1、SORT命令
SORT命令可以对列表类型、集合类型和有序集合类型键进行排序,并且可以完成与关系数据库中的连接查询相类似的任务。
在对有序集合进行排序时会忽略元素的分数,只针对元素自身的值进行排序。
除了可以排列数字外,SORT命令还可以通过 ALPHA 参数实现按照字典顺序排列非数字元素。
SORT mylist ALPHA
SORT mylist DESC 倒序
SORT mylist LIMIT offset count 表示跳过前offset个元素并获取之后的count个元素。
2、BY 参数
BY 参考键参考键可以是字符串类型键或者是散列类型键的某个字段(表示为键名--->字段名)。如果提供了BY参数,SORT命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个“*”并获取其值,然后依据该值对元素排序。
SORT tag:ruby:posts BY post:*->time 散列类型
SORT sortbuylist BY itemscore:* DESC 字符串类型
当参考键名不包含“*”时(既常量键名,与元素值无关),SORT命令将不会执行排序操作,应为Redis认为这种情况是没有意义的(因为所有要比较的值都一样)。
如果几个元素的参考键值相同,则SORT命令会再比较元素本身的值来决定元素的顺序。
3、GET 参数
Get参数不影响排序,它的作用是使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。GET参数的规则和BY参数一样,也支持字符串类型和散列类型的键,并使用“*”作为占位符。
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title
在一个SORT命令中可以有多个GET参数(而BY参数只能有一个)
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time
有N个GET参数,每个元素返回的结果就有N行。
4、STORE 参数
默认情况下SORT会直接返回排序结果,如果希望保存排序结果,可以使用STORE参数。如果希望把结果保存到 sort.result 键中:
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time STORE sort.result
保存后的键的类型为列表类型,如果键已经存在则会覆盖他。加上 STORE 参数后 SORT 命令的返回值为结果的个数。
STORE 参数常用来结合EXPIRE命令缓存排序结果。
5、性能优化
SORT是Redis中最强大最复杂的命令之一,如果使用不好很容易成为性能瓶颈。SORT命令的时间复杂度是 O(n + mlog(m)),其中n表示要排序的列表(集合或有序集合)中的元素个数,m表示要返回的元素个数。
使用SORT命令时需要注意以下几点:
尽可能减少待排序键中元素的数量;使用 LIMIT 参数只获取需要的数据;如果要排序的数据量较大,尽可能使用 STORE 参数将结果缓存。