Redis Sort 命令簡介

bwangel23發表於2017-06-20

sort命令是Redis中最強大的命令之一,本文試圖通過一些例子來總結Redis Sort的常用方法。

對列表排序的簡單例子

127.0.0.1:6379> RPUSH users 3 4 5 1 33 8
(integer) 6
127.0.0.1:6379> SORT users
1) "1"
2) "3"
3) "4"
4) "5"
5) "8"
6) "33"

在上面的例子中,我們對一系列的數字進行了排序,得到了排序後的結果。

列表排序的更高階的例子

127.0.0.1:6379> RPUSH users 3 4 5 1 33 8
(integer) 6
127.0.0.1:6379> SORT users limit 1 4 asc alpha
1) "3"
2) "33"
3) "4"
4) "5"

在上面的例子中,我們使用了三個引數,limit, ascalpha
limit表示對結果進行分頁,其中1表示頁數,4表示一頁中元素的個數。
asc表示對結果進行正序排序。
alpha表示對結果使用字母序排序,而不是數字序。

基於引用物件進行排序

# 首先新增一組使用者ID
127.0.0.1:6379> RPUSH users 13 84 23 454
(integer) 4
# 然後新增一些user_age:id key用來表示使用者的年齡
127.0.0.1:6379> set user_age:13 20
OK
127.0.0.1:6379> set user_age:84 23
OK
127.0.0.1:6379> set user_age:23 34
OK
127.0.0.1:6379> set user_age:454 11
# 使用sort命令基於使用者年齡對使用者進行排序
127.0.0.1:6379> sort users by user_age:* desc
1) "23"
2) "84"
3) "13"
4) "454"

在上面的例子中,我們使用一些值user_age:*,來對列表進行排序。
我們通過sort命令強大的by引數來設定排序的規則。by引數除了可以指定基於鍵值對資料進行排序外,也可以基於雜湊物件進行排序,請看下面這個例子:

# 新增一組使用者ID
127.0.0.1:6379> RPUSH users 13 84 23 454
(integer) 4
# 新增了一組雜湊物件來表示使用者
127.0.0.1:6379> hmset user:13 age 20 name user_13
OK
127.0.0.1:6379> hmset user:84 age 23 name user_84
OK
127.0.0.1:6379> hmset user:23 age 34 name user_23
OK
127.0.0.1:6379> hmset user:454 age 11 name user_454
OK
# 基於雜湊物件的來對上面的例子進行排序
127.0.0.1:6379> sort users by user:*->age
1) "454"
2) "13"
3) "84"
4) "23"
# 基於雜湊物件的來對上面的例子進行排序,並獲取使用者名稱稱
127.0.0.1:6379> sort users by user:*->age get user:*->name
1) "user_454"
2) "user_13"
3) "user_84"
4) "user_23"

在這個例子中,users是一個列表用來表示使用者ID,user:*為雜湊物件用來表示使用者。
在第一個sort命令中,我們基於使用者雜湊物件的age欄位來進行排序,得到的結果為排序過後的使用者ID列表。
如果想要取的返回值不是使用者ID的話,也可以通過get引數來指定獲取的欄位。
在第二個sort命令中,我們還是通過使用者雜湊物件的age欄位來排序,獲取的結果為使用者雜湊物件的name欄位組成的陣列。

儲存查詢結果

# 新增一組使用者ID
127.0.0.1:6379> RPUSH users 13 84 23 454
# 新增一組key用來表示使用者年齡
127.0.0.1:6379> set user_age:13 20
OK
127.0.0.1:6379> set user_age:84 23
OK
127.0.0.1:6379> set user_age:23 34
OK
127.0.0.1:6379> set user_age:454 11
OK
# 根據使用者年齡對使用者ID進行排序,並將排序結果儲存在users_sort_result所代表的列表中
127.0.0.1:6379> SORT users by user_age:* desc store users_sort_result
(integer) 4
# 為排序結果設定過期時間
127.0.0.1:6379> expire users_sort_result 30
(integer) 1

在上面的例子中,我們根據使用者年齡對使用者ID進行了排序,同時為排序結果設定了一個過期時間,這樣我們就可以將排序結果快取起來了。
然後每回獲取排序結果的時候,我們可以先查快取,如果快取不存在的話,則進行排序。
需要注意的是,為了避免多個客戶端同時操作排序結果,我們需要使用SETNX命令來為快取結果設定一個鎖,詳見SETNX key value

相關文章