排序

sort key

  • sort key: 对指定 key 的 value 进行排序

    • value 必须是数字, 如果是字符串, 需要用到可选参数

    • sort key 升序

    • sort key desc 降序

redis> LPUSH today_cost 30 1.5 10 8
(integer) 4
redis> SORT today_cost
1) "1.5"
2) "8"
3) "10"
4) "30"

sort key alpha

  • sort key alpha

    • 如果指定 key 的 value 是字符串, 需要加下 alpha 参数来进行排序

    • sort key alpha 升序

    • sort key alpha desc 降序

sort key limit offset count

  • sort key limit offset count

    • 对排序后的结果进行截取, 截取从 offset 处开始的 count 个元素

    • sort key limit offset count 升序

    • sort key limit offset count desc 降序

sort key by

  • sort key by

    • 通过外部其它 key 的 value 来排序, 前提是当前 key 中的元素与外部 key 中的 value 有某种联系

    • 如: sort uid by user_level_*

      • * 是一个占位符, 它先取出 uid 中的值, 再用这个值替换 user_level_* 中的星号, 然后根据替换后的 key 的 value 来排序

      • 比如在对 uid 列表进行排序时, 就会先取出 uid 的值 2、 4、 1、 3, 然后使用 user_level_2、 user_level_4、 user_level_1 和 user_level_3 的值作为排序 uid 的权重

    • 如果 by 后面的 key 不存在, 那么就会直接返回 uid 的元素(不排序)

sort key get

  • sort key get

    • 取出与当前 key 中元素相关联的外部 key 的 value

    • 如: sort uid get user_level_*

      • 先对 uid 的值进行排序, 1、2、3、4, 然后取出 user_level_1、 user_level_2、 user_level_3 和 user_level_4 的值

    • get 可以批量操作

      • sort uid get user_level_* get user_name_*

    • get # 可以取出当前 key 的元素, 而不是与之关联的外部 key 的 value, 这个例子中就是 1、2、3、4

sort key by get

  • sort key by get

    • 通过组合使用 by 和 get, 可以让排序结果以更直观的方式显示出来

      • 如 sort uid by user_level_* get user_name_*

        • 先按 user_level_{uid} 来排序 uid 列表

        • 再取出相应的 user_name_{uid} 的值

redis 127.0.0.1:6379> sort uid by user_level_* get user_name_*
1) "jack"       # level = 10
2) "peter"      # level = 25
3) "mary"       # level = 70
4) "admin"      # level = 9999

现在的排序结果要比只使用 sort uid by user_level_* 要直观得多

  • 特殊用法

    • 在不排序的情况下获取多个与当前 key 中元素相关联的外部 key 的 value

      • by 一个不存在的 key

      • 如 sort uid by noExists get user_name_* get user_level_*

        • 先按 noExists 来排序 uid 列表

          • 因为 noExists 不存在, 所以不排序, 直接返回当前 uid 列表

        • 再取出相应的 user_name_{uid} 的值

      • 功能相当于 mysql 中的联结查询

get/by hash

上面介绍的 get 和 by 参数, 其外部 key 还可以是 hash, 其语法类似指针.

假设 user_1、user_2、user_3 都保存的是 hash, 该 hash 中的 field 是 level, 现在想根据 hash 中的 level 来排序, 可以这么写:

sort uid by user_*->level

sort key store destination

  • sort key store destination

    • 将排序结果保存在 destination 中

注意事项

sort 命令较耗内存, 其时间复杂度为 O(N+M*log(M)), N 为要排序的列表或集合内的元素数量, M 为要返回的元素数量

  • 尽可能地减少待排序 key 中 List/Set 的长度 (减小 N)

  • 擅用 limit 参数 (减少 M)

Last updated