1、简单描述

   sort命令可以对list、set和sorted set的元素进行排序,然后显示排序的结果,不影响这些类型里面存储的数据的排序。就是说sort可以对list的元素排序,但是执行lrange等命令会发现在内存中存储的元素的顺序没变。

 

2、相关操作(基于4.0.1版本)

sort的格式:

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

 1)sort key 不加其他的参数,那么会按照asc的方式来排序,注意这里前提是元素的值是数字类型,如果元素的值是字符串,需要加上alpha(表示按照字母排序)才能排序。

redis sortset 原理 redis sortset命令_字符串

 2)sort key by pattern 就是按照一个模式来排序

 

redis sortset 原理 redis sortset命令_redis sortset 原理_02

3)sort key get pattern:返回的值是按照get pattern来显示,其中get #表示显示原来的key里面元素的值。

redis sortset 原理 redis sortset命令_字符串_03

4)sort key limit start num: 获取从下标start开始的num个元素,注意下标是从0开始计算的。

redis sortset 原理 redis sortset命令_redis sortset 原理_04

5)sort key store 目标list:把排序的结果存储到一个目标list上。

redis sortset 原理 redis sortset命令_服务器_05

 

3、小结

1)大数据量的sort命令会占用不少时间,由于redis是单进程单线程的,那么在sort排序期间,其他的client的操作就会被阻塞,要等待。解决方法就是把这种耗时的操作放在slave机器(主从复制的从机器)去执行,另外就是对排序的结果存储起来,避免多次做同一sort操作。还有一种做法是采用sorted set根据需求建立索引。

2)如果有多个redis server,比如集群的情况下,key可能会放在不同的服务器上,那么是不好操作的,如果进行sort要根据所有的name*的排序结果来排序某个list或者set,会很难操作,那么可以使用一致性哈希算法,尽量把包含有相同用途的key放在同一台服务器上,比如key的名称可以用{}包含相同的部分,比如{name}11 ,  {name}12,根据{}里面的内容做哈希算法,那么{name}11 和{name}12等key会存放在同一台服务器上,方便做sort等操作。{}这个叫做hash tag,有兴趣的朋友可以自行搜索hash tag去进一步了解。