不少场合须要对元素进行排序,这时除了使用有序集合外,还能够借助Redis提供的SORT命令来排序。缓存
SORT命令能够对列表类型、集合类型和有序集合类型的键进行排序。ruby
SORT key SORT key DESC SORT key ALPHA
SORT命令会根据元素自身的值进行排序,在对有序集合类型排序时会忽略元素的分数。
默认按从小到大的顺序排列,增长DESC参数能够按照倒序排列。
若是元素为非数字,增长ALPHA参数能够按照字典顺序排列。若是直接对非数字元素排序会报错:性能优化
(error)ERR One or more scores can't be converted into double
若是没有加ALPHA参数的话,SORT命令会尝试将全部元素转换成双精度浮点数来比较,若是没法转换则会提示错误。post
若是返回结果数量较多须要分页,可使用LIMIT参数性能
SORT key DESC LIMIT offset count
表示在排序结果中,跳过前offset个元素,获取以后的count个元素。大数据
不少状况下列表(或集合、有序集合)中存储的元素值表明的是对象的ID,单纯对这些ID自身排序有时意义并不大。更多的时候会但愿根据ID对应的对象的某个属性进行排序。
这种状况下可使用BY参数:优化
SORT key BY reference
其中reference表示排序的参考键,会根据参考键的值来排序,而再也不是列表或集合中元素自身的值。
好比:code
SORT tag:ruby:posts BY post:* -> time DESC
这里tag:ruby:posts存储了文章的ID,post:*为散列类型,其中的time字段为文章的发布时间,这样就能够将文章ID根据发布时间排序了。执行的时候,对每一个元素使用元素的值替换参考键中的第一个“*”并获取其值,而后依据该值对元素排序。对象
上面是基于散列类型排序的写法,基于字符串排序更简单:排序
SORT sortbylist BY itemscore:* -> time DESC
BY参数排序有下面几种特殊状况:
SORT命令默认返回的是键自己的元素被排序后的结果,而使用GET参数能够指定返回键值。
好比前面按照文章发布时间排序后,并不单单得到文章ID,而是更进一步获取文章的标题,能够这样写:
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
若是仍然须要文章的ID,可使用GET #:
SORT tag:ruby:posts BY post:* -> time DESC GET post:*-> title GET post:* -> time GET #
这样最终的结果就包含了文章的标题、发布时间和ID。
默认状况下SORT会直接返回排序结果,若是但愿保存排序结果,可使用STORE参数,好比要把排序的结果保存到sort.result键中:
SORT tag:ruby:posts BY post:* -> time DESC STORE sort.result
保存后的键的类型为列表类型,若是键已经存在则会覆盖它。加上STORE参数后SORT命令的返回值为结果的个数。
实际使用中,经常将STORE命令与以前学过的EXPIRE结合,来缓存排序的结果。
SORT是Redis中最强大最复杂的命令之一,但若是使用很差也很容易成为性能的瓶颈。
SORT命令的时间复杂度是O(n+mLog m),其中:
因此在使用SORT命令时要注意这几点: