Redis排序

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 参数将结果缓存。

猜你喜欢

转载自decao.iteye.com/blog/2401072