Redis之sort使用(三)

    xiaoxiao2023-10-15  31

    使用外部 key 进行排序

    可以使用外部 key 的数据作为权重,代替默认的直接对比键值的方式来进行排序。

    假设现在有用户数据如下: uid     user_name_{uid}     user_level_{uid} 1          admin                         9999 2          jack                              10 3          peter                              25 4          mary                              70

    以下代码将数据输入到 Redis 中: # admin redis 127.0.0.1:6379> LPUSH uid 1 (integer) 1 redis 127.0.0.1:6379> SET user_name_1 admin OK redis 127.0.0.1:6379> SET user_level_1 9999 OK # jack redis 127.0.0.1:6379> LPUSH uid 2 (integer) 2 redis 127.0.0.1:6379> SET user_name_2 jack OK redis 127.0.0.1:6379> SET user_level_2 10 OK # peter redis 127.0.0.1:6379> LPUSH uid 3 (integer) 3 redis 127.0.0.1:6379> SET user_name_3 peter OK redis 127.0.0.1:6379> SET user_level_3 25 OK # mary redis 127.0.0.1:6379> LPUSH uid 4 (integer) 4 redis 127.0.0.1:6379> SET user_name_4 mary OK redis 127.0.0.1:6379> SET user_level_4 70 OK

    BY 选项

    默认情况下, SORT uid 直接按 uid 中的值排序: redis 127.0.0.1:6379> SORT uid 1) "1" # admin 2) "2" # jack 3) "3" # peter 4) "4" # mary

    通过使用 BY 选项,可以让 uid 按其他键的元素来排序。

    比如说, 以下代码让 uid 键按照 user_level_{uid} 的大小来排序: redis 127.0.0.1:6379> SORT uid BY user_level_* 1) "2" # jack , level = 10 2) "3" # peter, level = 25 3) "4" # mary, level = 70 4) "1" # admin, level = 9999

    user_level_* 是一个占位符, 它先取出 uid 中的值, 然后再用这个值来查找相应的键。

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

    GET 选项 使用 GET 选项, 可以根据排序的结果来取出相应的键值。

    比如说, 以下代码先排序 uid , 再取出键 user_name_{uid} 的值: redis 127.0.0.1:6379> SORT uid GET user_name_* 1) "admin" 2) "jack" 3) "peter" 4) "mary"

    组合使用 BY 和 GET

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

    以下代码先按 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_* 要直观得多。

    获取多个外部键 可以同时使用多个 GET 选项, 获取多个外部键的值。

    以下代码就按 uid 分别获取 user_level_{uid} 和 user_name_{uid} : redis 127.0.0.1:6379> SORT uid GET user_level_* GET user_name_* 1) "9999" # level 2) "admin" # name 3) "10" 4) "jack" 5) "25" 6) "peter" 7) "70" 8) "mary"

    GET 有一个额外的参数规则,那就是 —— 可以用 # 获取被排序键的值。

    以下代码就将 uid 的值、及其相应的 user_level_* 和 user_name_* 都返回为结果: redis 127.0.0.1:6379> SORT uid GET # GET user_level_* GET user_name_* 1) "1" # uid 2) "9999" # level 3) "admin" # name 4) "2" 5) "10" 6) "jack" 7) "3" 8) "25" 9) "peter" 10) "4" 11) "70" 12) "mary"

    获取外部键,但不进行排序

    通过将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作, 直接返回结果: redis 127.0.0.1:6379> SORT uid BY not-exists-key 1) "4" 2) "3" 3) "2" 4) "1"

    这种用法在单独使用时,没什么实际用处。

    不过,通过将这种用法和 GET 选项配合, 就可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于 SQL 数据库的 join 关键字)。

    以下代码演示了,如何在不引起排序的情况下,使用 SORT 、 BY 和 GET 获取多个外部键: redis 127.0.0.1:6379> SORT uid BY not-exists-key GET # GET user_level_* GET user_name_* 1) "4" # id 2) "70" # level 3) "mary" # name 4) "3" 5) "25" 6) "peter" 7) "2" 8) "10" 9) "jack" 10) "1" 11) "9999" 12) "admin"

    将哈希表作为 GET 或 BY 的参数

    除了可以将字符串作为键之外, 哈希表也可以作为 GET 或 BY 选项的参数来使用。 uid     user_name_{uid}     user_level_{uid} 1          admin                         9999 2          jack                              10 3          peter                              25 4          mary                              70

    我们可以不将用户的名字和级别保存在 user_name_{uid} 和 user_level_{uid} 两个字符串键中, 而是用一个带有 name 域和 level 域的哈希表 user_info_{uid} 来保存用户的名字和级别信息: redis 127.0.0.1:6379> HMSET user_info_1 name admin level 9999 OK redis 127.0.0.1:6379> HMSET user_info_2 name jack level 10 OK redis 127.0.0.1:6379> HMSET user_info_3 name peter level 25 OK redis 127.0.0.1:6379> HMSET user_info_4 name mary level 70 OK 之后, BY 和 GET 选项都可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域: redis 127.0.0.1:6379> SORT uid BY user_info_*->level 1) "2" 2) "3" 3) "4" 4) "1" redis 127.0.0.1:6379> SORT uid BY user_info_*->level GET user_info_*->name 1) "jack" 2) "peter" 3) "mary" 4) "admin"

    http://doc.redisfans.com/key/sort.html#alpha

    最新回复(0)