redis sort 實現list與hash的連接 查出sql表的一行
SORT
使用外部 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"
redis sort 實現list與hash的連接 查出sql表的一行