LedisDB支持Redis sort

LedisDB本來是沒有sort命令的,而且實際我們也沒有使用過該命令,但一位用戶給我反應(yīng)他迫切需要這個功能,我決定首先考察一下redis相關(guān)的實現(xiàn),再看是否提供。

然后我一看redis的sort命令,真的是震驚了,這可能算得上redis里面最復(fù)雜的一個命令了,命令原型如下:

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]

如果不仔細看文檔,或者看源碼,一下子真的不知道這個命令怎么用。首先我們可以去掉LIMIT offset count這個選項,這個很容易理解,就是排好序之后取偏移數(shù)據(jù)。ASC和DESC這個也比較容易,就是正向和逆向排序。STORE destination這個其實就是將排好序的數(shù)據(jù)放到destination這個list里面,也比較容易理解。好了,去掉這些,那么sort的原型就是這個樣子了:

SORT key [BY pattern] [GET pattern [GET pattern ...]] [ALPHA]

key里面存儲的就是需要排序的東西,所以key只能是list,set或者zset類型,我們以list為例。假設(shè)做如下操作:

redis> lpush a 1 2 3
redis> lrange a 0 -1
1) "3"
2) "2"
3) "1"

如果使用sort,則排序結(jié)果如下:

redis> sort a
1) "1"
2) "2"
3) "3"

呢么ALPHA是什么意思呢?我們可以做如下操作解釋:

redis> lpush b a1 a2 a3
redis> sort b
(error) ERR One or more scores can't be converted into double
redis> sort b alpha
1) "a1"
2) "a2"
3) "a3"

我們在b里面壓入的是字符串,所以不能直接sort,必須指定alpha方式。所以alpha就是明確告知sort使用字節(jié)序排序,不然sort就會嘗試將需要排序的數(shù)據(jù)轉(zhuǎn)成double類型。

理解了alpha,我們再來看看by的含義,如下例子:

redis> set w_1 30
redis> set w_2 20
redis> set w_3 10
redis> sort a by w_*
1) "3"
2) "2"
3) "1"
127.0.0.1:6379>

如果有by了,sort就會首先取出對應(yīng)的數(shù)據(jù),也就是1,2,3,然后跟by的pattern進行組合,變成w_1,w_2,w_3,然后以這個作為key去獲取對應(yīng)的值,也就是30,20,10,在按照這些值進行排序。上面這個例子,1對應(yīng)的by值最大,為30,所以升序排列的時候在最后。

說完了by,我們再來說說get,get是不參與排序的,只是在排完序之后,將排好序的值依次跟get的pattern組合,獲取對應(yīng)的數(shù)據(jù),進行返回,如下例子:

redis> set o_1 10
redis> set o_2 20
redis> set o_3 30
redis> sort a get o_*
1) "10"
2) "20"
3) "30"

再來一個多個get的例子:

redis> set oo_1 100
redis> set oo_2 200
redis> set oo_3 300
redis> sort a get o_* get oo_*
1) "10"
2) "100"
3) "20"
4) "200"
5) "30"
6) "300"

從上面可以看到,如果有多個get,那么sort的做法是對于排好序的一個值,依次通過get獲取值,放到結(jié)果中,然后在處理下一個值。

如果有g(shù)et,我們就能獲取到相關(guān)的值,但這時候我們還需要返回原有的值怎么辦?只需要get #就成了,如下:

redis> sort a get o_* get #
1) "10"
2) "1"
3) "20"
4) "2"
5) "30"
6) "3"

好了,折騰了這么久,我算是終于理解了sort的原理,然后在看完sort的實現(xiàn),依葫蘆畫瓢在LedisDB里面支持了sort。當然在一些底層細節(jié)上面還是稍微跟redis不一樣的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容