序
redis的一个强大之处就是排序,可以轻易解决传统数据库对数据排序组合的难题,下面是redis排序命令的一些总结
SORT KEY
-
这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果,sort命令可以对列表、集合、有序集合进行排序,对有序集合排序时会忽略分数
redis> lpush ml 12 (integer) 1 redis> lpush ml 11 (integer) 2 redis> lpush ml 23 (integer) 3 redis> lpush ml 13 (integer) 4 redis> sort ml 1. "11" 2. "12" 3. "13" 4. "23"
[ASC|DESC] [ALPHA]
-
sort默认的排序方式(asc)是从小到大排的,当然也可以按照逆序或者按字符顺序排。逆序可以加上desc选项,想按字母顺序排可以加alpha选项,当然alpha可以和desc一起用
redis> lpush mylist baidu (integer) 1 redis> lpush mylist hello (integer) 2 redis> lpush mylist xhan (integer) 3 redis> lpush mylist soso (integer) 4 redis> sort mylist alpha 1. "baidu" 2. "hello" 3. "soso" 4. "xhan" redis> sort mylist desc alpha 1. "xhan" 2. "soso" 3. "hello" 4. "baidu"
[BY pattern]
- 除了可以按集合元素自身值排序外,还可以将集合元素内容按照给定pattern组合成新的key,并按照新key中对应的内容进行排序
redis> set name11 nihao
OK
redis> set name12 wo
OK
redis> set name13 shi
OK
redis> set name23 lala
OK
redis> sort ml by name*
1) "23"
2) "11"
3) "13"
4) "12"
-
*代表了ml中的具体元素值,当参考建不存在时默认为默认为0,当参考键相同时按照本身的顺序排序
-
按照了name*字符串中的字母排序m1进行排序
-
还可以依照哈希中的某个值来进行排序
hset user11 name 1
……
sort ml by user*->name
依照哈希中的name字段排序
[GET pattern]
- 我们也可以通过get选项去获取指定pattern作为新key对应的值
redis> sort ml by name* get name* alpha
1. "lala"
2. "nihao"
3. "shi"
4. "wo"
-
get选项可以有多个。by只能有一个,对应的不存在时候返回的是nil。可以没有by只有get
-
#特殊符号引用的是原始集合也就是ml
redis> sort ml by name* get name* get # alpha
1. "lala"
2. "23"
3. "nihao"
4. "11"
5. "shi"
6. "13"
7. "wo"
8. "12"
[LIMIT start count]
- 上面例子返回结果都是全部。limit选项可以限定返回结果的数量
redis> sort ml get name* limit 1 2
1. "wo"
2. "shi"
- start下标是从0开始的,这里的limit选项意思是从第二个元素开始获取2个
[STORE dstkey]
- 如果对集合经常按照固定的模式去排序,那么把排序结果缓存起来会减少不少cpu开销.使用store选项可以将排序内容保存到指定key中
redis> sort ml get name* limit 1 2 store cl
(integer) 2
redis> type cl
list
redis> lrange cl 0 -1
1. "wo"
2. "shi"
注意
-
尽量减少待排序元素数量
-
使用limit
-
使用缓存缓存结果