zoukankan      html  css  js  c++  java
  • Redis

    SORT 命令格式

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

    基本用法

    SORT 命令可以对列表类型、集合类型和有序集合类型键进行排序。

    对列表排序:

    127.0.0.1:6379> LPUSH list 2 0 1 6
    (integer) 4
    127.0.0.1:6379> SORT list
    1) "0"
    2) "1"
    3) "2"
    4) "6"

    对集合排序:

    127.0.0.1:6379> SADD set 4 3 9 9
    (integer) 3
    127.0.0.1:6379> SORT set
    1) "3"
    2) "4"
    3) "9"

    对有序集合排序(在对有序集合排序时会忽略元素的分数):

    127.0.0.1:6379> ZADD sorted_set 50 2 40 3 20 1 60 5
    (integer) 4
    127.0.0.1:6379> SORT sorted_set
    1) "1"
    2) "2"
    3) "3"
    4) "5"

    ALPHA 参数

    通过 ALPHA 参数实现按照字段顺序排序非数字元素。

    127.0.0.1:6379> RPUSH list r e d i s
    (integer) 5
    127.0.0.1:6379> SORT list
    (error) ERR One or more scores can't be converted into double
    127.0.0.1:6379> SORT list ALPHA
    1) "d"
    2) "e"
    3) "i"
    4) "r"
    5) "s"

    从上面的示例看,如果没有加 ALPHA 参数,SORT 命令会尝试将所有元素转换成双精度浮点数来比较,如果无法转换则会提示错误。

    DESC 参数

    DESC 参数可以实现将元素按照从大到小的顺序排序。

    127.0.0.1:6379> LPUSH list 2 0 1 6
    (integer) 4
    127.0.0.1:6379> SORT list DESC
    1) "6"
    2) "2"
    3) "1"
    4) "0"

    LIMIT 参数

    SORT 命令还支持 LIMIT 参数来返回指定范围的结果。用户和 SQL 的语句一样,LIMIT offset count,表示跳过前 offset 个元素并获取之后的 count 个元素。

    127.0.0.1:6379> LPUSH list 2 0 1 6
    (integer) 4
    127.0.0.1:6379> SORT list DESC LIMIT 1 2
    1) "2"
    2) "1"

    BY 参数

    很多情况下列表(或集合、有序集合)中存储的元素是对象的 ID,单纯对这些 ID 排序有时意义并不大。更多的时候我们需要根据 ID 对应的对象的某个属性进行排序。比如要以商品的价格为依据对商品进行排序,则需要使用 SORT 命令的 BY 参数。BY 参数的语法为 BY pattern,pattern 可以是字符串类型键或者是散列类型键的某个字段。如果提供了 BY 参数,SORT 命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换 pattern 中的第一个 * 并获取其值,然后依据该值排序。

    127.0.0.1:6379> HMSET item:1 name iphone6 price 5999
    OK
    127.0.0.1:6379> HMSET item:2 name ipad price 2888
    OK
    127.0.0.1:6379> HMSET item:3 name applewatch price 8688
    OK
    127.0.0.1:6379> SADD item:ids 1 2 3
    (integer) 3
    127.0.0.1:6379> SORT item:ids BY item:*->price
    1) "2"
    2) "1"
    3) "3"

    当 pattern 不包含 "*" 时,即常量键名,SORT 命令将不会执行排序操作,因为 Redis 认为这种情况是没有意义的。

    当某个元素的 pattern 不存在时,会默认 pattern 的值为 0,如:

    127.0.0.1:6379> HSET item:4 name mac
    (integer) 1
    127.0.0.1:6379> SADD item:ids 4
    (integer) 1
    127.0.0.1:6379> SORT item:ids BY item:*->price
    1) "4"
    2) "2"
    3) "1"
    4) "3"

    GET 参数

    GET 参数不影响排序,它的作用是使 SORT 命令的返回结果不再是元素自身的值,而是 GET 中指定的键值。

    127.0.0.1:6379> HMSET item:1 name iphone6 price 5999
    OK
    127.0.0.1:6379> HMSET item:2 name ipad price 2888
    OK
    127.0.0.1:6379> HMSET item:3 name applewatch price 8688
    OK
    127.0.0.1:6379> SADD item:ids 1 2 3
    (integer) 3
    127.0.0.1:6379> SORT item:ids BY item:*->price GET item:*->name
    1) "ipad"
    2) "iphone6"
    3) "applewatch"

    可以使用 GET # 返回商品的 ID:

    127.0.0.1:6379> SORT item:ids BY item:*->price GET # GET item:*->name
    1) "2"
    2) "ipad"
    3) "1"
    4) "iphone6"
    5) "3"
    6) "applewatch"

    STORE 参数

    如果希望保存排序结果,可以使用 STORE 参数。

    127.0.0.1:6379> SORT item:ids BY item:*->price GET # GET item:*->name STORE sorted_items
    (integer) 6
    127.0.0.1:6379> LRANGE sorted_items 0 -1
    1) "2"
    2) "ipad"
    3) "1"
    4) "iphone6"
    5) "3"
    6) "applewatch"

    STORE 参数常用来结合 EXPIRE 命令缓存排序结果。

    性能优化

    SORT 命令的时间复杂度是 O(N+M*log(M)),其实 N 表示要排序的列表(集合或有序集合)中的元素个数,M 表示要返回的元素个数。

    开发过程中应注意以下几点以提高性能:

    1. 尽可能减少带排序键中的数量(使 N 尽可能小)。
    2. 使用 LIMIT 参数只获取需要的数据(使 M 尽可能小)。
    3. 如果要排序的数据数量较大,尽可能使用 STORE 参数将结果缓存。
  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/huey/p/5655023.html
Copyright © 2011-2022 走看看