美文网首页
Redis的排序命令使用(Sort)

Redis的排序命令使用(Sort)

作者: 9c46ece5b7bd | 来源:发表于2018-12-31 16:35 被阅读20次

    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排序,仅在结果集过期后进行排序

    相关文章

      网友评论

          本文标题:Redis的排序命令使用(Sort)

          本文链接:https://www.haomeiwen.com/subject/racwlqtx.html