1. 程式人生 > >redis sort 實現list與hash的連接 查出sql表的一行

redis sort 實現list與hash的連接 查出sql表的一行

integer 一個 有用 查找 mar join fan 實現 eve

SORT

使用外部 key 進行排序

可以使用外部 key 的數據作為權重,代替默認的直接對比鍵值的方式來進行排序。

假設現在有用戶數據如下:

uiduser_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 的值 1234 , 然後使用 user_level_1user_level_2user_level_3user_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

通過組合使用 BYGET , 可以讓排序結果以更直觀的方式顯示出來。

比如說, 以下代碼先按 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 關鍵字)。

以下代碼演示了,如何在不引起排序的情況下,使用 SORTBYGET 獲取多個外部鍵:

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 的參數

除了可以將字符串鍵之外, 哈希表也可以作為 GETBY 選項的參數來使用。

比如說,對於前面給出的用戶信息表:

uiduser_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

之後, BYGET 選項都可以用 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"

redis sort 實現list與hash的連接 查出sql表的一行