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 参数将结果缓存。
  • 相关阅读:
    【BZOJ4275】[ONTAK2015]Badania naukowe DP
    【BZOJ4295】[PA2015]Hazard 乱搞
    【BZOJ4297】[PA2015]Rozstaw szyn 树形DP
    Windows服务安装异常:System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可 访问的日志: Security
    直关的sql 联级更新语句
    c#经典俄罗斯方块 vs2012开发
    转 SSIS处理导入数据时, 存在的更新, 不存在的插入
    WM (Constants)
    数据仓库的模型设计
    BI (商业智能)
  • 原文地址:https://www.cnblogs.com/huey/p/5655023.html
Copyright © 2011-2022 走看看