Redis的排序命令使用(Sort)
- 2019 年 10 月 4 日
- 筆記
撸了今年阿里、头条和美团的面试,我有一个重要发现…….>>>

sort排序的用法
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
用来返回或保存给定列表
、集合
、有序集合
中经过排序的元素。
注意:sort 默认使用数字进行排序,如果是字符串需要加ALPHA参数,否则会报错
普通排序
简单的排序方式:
- sort key 按照key进行升序排序
- sort key desc 按照key进行降序排序
# 构造一个list 127.0.0.1:6379> LPUSH day 2 1 3 52 4 9 7 5 8 (integer) 9 # 查看list元素 127.0.0.1:6379> LRANGE day 0 -1 1) "8" 2) "5" 3) "7" 4) "9" 5) "4" 6) "52" 7) "3" 8) "1" 9) "2" 127.0.0.1:6379> SORT day 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "7" 7) "8" 8) "9" 9) "52" 127.0.0.1:6379> SORT day desc 1) "52" 2) "9" 3) "8" 4) "7" 5) "5" 6) "4" 7) "3" 8) "2" 9) "1"
使用ALPHA修饰符对字符串进行排序
sort
默认使用数据进行排序,如果value是字符串,需要再key后面增加alpha
参数。
127.0.0.1:6379> LPUSH testkey biao afada terna martin (integer) 4 127.0.0.1:6379> SORT testkey (error) ERR One or more scores can't be converted into double 127.0.0.1:6379> SORT testkey alpha 1) "afada" 2) "biao" 3) "martin" 4) "terna"
注意:如果linux设置了LC_COLLATE环境,可以自动识别UTF-8
使用limit限制返回结果
limit可以接受两个参数:
- offset 指定要跳过的元素数量
- count 指定跳过 offset 个指定的元素之后,要返回多少个对象
127.0.0.1:6379> SORT testkey alpha limit 0 1 1) "afada" 127.0.0.1:6379> SORT testkey alpha limit 1 1 1) "biao"
使用外部key进行排序
可以使用外部key 的数据作为权重
,代替默认的直接对比键值
的方式来进行排序。
假设用户数据可以分为三列:uid、user_name_{uid}、user_day_{uid}
127.0.0.1:6379> LPUSH uid 1 (integer) 1 127.0.0.1:6379> LPUSH uid 2 (integer) 2 127.0.0.1:6379> LPUSH uid 3 (integer) 3 127.0.0.1:6379> LPUSH uid 4 (integer) 4 127.0.0.1:6379> set user_name_1 biao OK 127.0.0.1:6379> set user_day_1 12 OK 127.0.0.1:6379> set user_name_2 bgbiao OK 127.0.0.1:6379> set user_day_2 15 OK 127.0.0.1:6379> set user_name_3 xxbandy OK 127.0.0.1:6379> set user_day_3 1 OK 127.0.0.1:6379> set user_name_4 bgops OK 127.0.0.1:6379> set user_day_4 13 OK
uid |
user_name_{uid} |
user_day_{uid} |
---|---|---|
1 |
biao |
12 |
2 |
bgbiao |
15 |
3 |
xxbandy |
1 |
4 |
bgops |
13 |
使用BY参数
## 使用uid降序排序 127.0.0.1:6379> sort uid desc 1) "4" 2) "3" 3) "2" 4) "1" ## 使用user_day_{uid}的值进行排序,并获取对应uid 127.0.0.1:6379> sort uid by user_day_* 1) "3" 2) "1" 3) "4" 4) "2"
使用GET参数
## 使用uid降序排序 127.0.0.1:6379> sort uid desc 1) "4" 2) "3" 3) "2" 4) "1" ## 排序后获取指定的字段 127.0.0.1:6379> sort uid desc get user_name_* 1) "bgops" 2) "xxbandy" 3) "bgbiao" 4) "biao"
组合使用BY和GET参数
## 获取按照user_day_{uid}进行降序排序后的uid 127.0.0.1:6379> sort uid desc by user_day_* 1) "2" 2) "4" 3) "1" 4) "3" ## 按照指定的字段进行排序,并获取指定字段的数据 127.0.0.1:6379> sort uid desc by user_day_* get user_name_* get user_day_* 1) "bgbiao" 2) "15" 3) "bgops" 4) "13" 5) "biao" 6) "12" 7) "xxbandy" 8) "1"
注意:同时可以获取多个字段
获取外部键,但不进行排序
通过将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作.
127.0.0.1:6379> sort uid by abc 1) "4" 2) "3" 3) "2" 4) "1"
不过,通过将这种用法和 GET 选项配合, 就可以在不排序的情况下, 获取多个外部键
, 相当于执行一个整合的获取操作(类似于 SQL 数据库的 join 关键字)
注意:GET #可以获取排序的外键
127.0.0.1:6379> sort uid by abc get # GET user_level_* GET user_name_* 1) "4" 2) "70" 3) "mary" 4) "3" 5) "25" 6) "peter" 7) "2" 8) "10" 9) "jack" 10) "1" 11) "9999" 12) "admin"
将哈希表作为get或by的参数
前面使用了字符串作为get和by的参数,哈希表也可以作为get和by的参数。
uid |
user_name_{uid} |
user_day_{uid} |
---|---|---|
1 |
biao |
12 |
2 |
bgbiao |
15 |
3 |
xxbandy |
1 |
4 |
bgops |
13 |
我们可以不将用户的名字和级别保存在 user_name_{uid} 和 user_day_{uid} 两个字符串键中, 而是用一个带有 name 域和 day 域的哈希表 user_info_{uid} 来保存用户的名字和天数
127.0.0.1:6379> HMSET user_info_1 name biao day 12 OK 127.0.0.1:6379> HMSET user_info_2 name bgbiao day 15 OK 127.0.0.1:6379> HMSET user_info_3 name xxbandy day 1 OK 127.0.0.1:6379> HMSET user_info_4 name bgops day 13 OK
注意:
BY 和 GET 选项都可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域
## 按照day进行排序,并输出uid,day,name 127.0.0.1:6379> SORT uid BY user_info_*->day get # get user_info_*->day get user_info_*->name 1) "3" 2) "1" 3) "xxbandy" 4) "1" 5) "12" 6) "biao" 7) "4" 8) "13" 9) "bgops" 10) "2" 11) "15" 12) "bgbiao"
使用redigo模块进行获取排序参数
sortv, _ := redis.Strings(conn.Do("sort", "uid", "desc", "by", "user_day_*", "get", "user_name_*", "get", "user_day_*")) fmt.Println(sortv) ## 输出结果 [bgbiao 15 bgops 13 biao 12 xxbandy 1]
保存排序结果
注意:默认sort仅用来排序,不会存储排序结果,可以使用STORE将结果存储到指定key中
127.0.0.1:6379> SORT uid BY user_info_*->day get # get user_info_*->day get user_info_*->name STORE sortresults (integer) 12 127.0.0.1:6379> type sortresults list 127.0.0.1:6379> LRANGE sortresults 0 2 1) "3" 2) "1" 3) "xxbandy"
注意:通常可以使用sort进行排序存储到一个key后,使用expire进行结果的缓存,这样可以避免频繁的进行sort排序,仅在结果集过期后进行排序