Redis排序命令Sort深入解析
引言
Redis是一款快速、優(yōu)秀的鍵值對(duì)數(shù)據(jù)庫,提供豐富的數(shù)據(jù)結(jié)構(gòu)能在各種場(chǎng)景下實(shí)現(xiàn)功能,同時(shí)也提供豐富的命令來完成各種各樣的功能,本篇文章將深入淺出的解析Sort命令的原理以及使用
原理
Sort 命令用來對(duì)list、set、zset對(duì)象進(jìn)行排序,返回排序后的結(jié)果
Sort命令會(huì)使用一個(gè)與原來對(duì)象等長的數(shù)組,數(shù)組中的節(jié)點(diǎn)RedisSortObject存儲(chǔ)了元素(指向?qū)?yīng)元素)以及權(quán)值,排序就是根據(jù)權(quán)值來排序,權(quán)值默認(rèn)情況下是浮點(diǎn)型,如果要排序的是字符串則權(quán)值為字符串對(duì)象
等長數(shù)組中的RedisSortObject節(jié)點(diǎn)會(huì)與排序?qū)ο笾械脑匾灰粚?duì)應(yīng)記錄元素對(duì)象的地址和權(quán)值

再使用快速排序根據(jù)等長數(shù)組中RedisSortObject對(duì)象中的權(quán)值進(jìn)行排序(默認(rèn)升序)

注意:排序只在新數(shù)組中操作,并沒有改變?cè)瓉淼膶?duì)象
圖中排序流程對(duì)應(yīng)以下命令操作
127.0.0.1:6379> lpush number 1 3 5 (integer) 3 127.0.0.1:6379> lrange number 0 -1 1) "5" 2) "3" 3) "1" 127.0.0.1:6379> sort number 1) "1" 2) "3" 3) "5"
alpha 選項(xiàng)
alpha選項(xiàng)對(duì)字符串進(jìn)行排序,如果對(duì)字符串進(jìn)行排序不使用alpha會(huì)報(bào)出字符串無法轉(zhuǎn)換為浮點(diǎn)型(默認(rèn)浮點(diǎn)型)的異常
使用alpha選項(xiàng)則是對(duì)字符串進(jìn)行排序
127.0.0.1:6379> sadd set z x c n r a (integer) 6 127.0.0.1:6379> smembers set 1) "x" 2) "n" 3) "a" 4) "r" 5) "z" 6) "c" 127.0.0.1:6379> sort set alpha 1) "a" 2) "c" 3) "n" 4) "r" 5) "x" 6) "z"
by 選項(xiàng)
如果希望不是根據(jù)當(dāng)前集合的元素進(jìn)行排序,而是根據(jù)其他Key來排序則使用 by 選項(xiàng)
by *-value表示獲取當(dāng)前元素的key代替*與-value拼接得到新的Key,查詢新Key得到的值拿來排序
這種情況下RedisSortObject中記錄的權(quán)值為新Key的值
比如當(dāng)前元素是cc 則新key為 cc-value ,查詢到新key值為88 因此排中間
如果新key結(jié)果為字符串 則要使用alpha 選項(xiàng)
127.0.0.1:6379> sadd set tom cc jack (integer) 3 127.0.0.1:6379> mset tom-value 99 cc-value 88 jack-value 77 OK 127.0.0.1:6379> smembers set 1) "cc" 2) "jack" 3) "tom" 127.0.0.1:6379> sort set by *-value 1) "jack" 2) "cc" 3) "tom" #使用新key的值為字符串時(shí)使用alpha 127.0.0.1:6379> mset tom-str a cc-str b jack-str c OK 127.0.0.1:6379> sort set alpha by *-str 1) "tom" 2) "cc" 3) "jack"
limit 選項(xiàng)
limit用來限制返回的數(shù)量,使用方式類比MySQL的limit
127.0.0.1:6379> sort set alpha by *-str 1) "tom" 2) "cc" 3) "jack" 127.0.0.1:6379> sort set alpha by *-str limit 0 2 1) "tom" 2) "cc" 127.0.0.1:6379> sort set alpha by *-str limit 1 2 1) "cc" 2) "jack"
get 選項(xiàng)
與by類似,但是by作用的是排序值,而get作用的是返回值
如果希望返回值不是當(dāng)前元素的值,而是其他key的返回值,則使用get
get *-res表示獲取當(dāng)前元素的key代替*與-res拼接得到新的Key,查詢新Key得到的值用于返回結(jié)果
比如當(dāng)前元素是cc 則新key為 cc-res ,查詢到新key值為cc-result 因此響應(yīng)時(shí)返回cc-result
127.0.0.1:6379> sort set alpha by *-str limit 0 3 1) "tom" 2) "cc" 3) "jack" 127.0.0.1:6379> mset tom-res tom-result cc-res cc-result jack-res jack-result OK 127.0.0.1:6379> sort set alpha by *-str limit 0 3 get *-res 1) "tom-result" 2) "cc-result" 3) "jack-result"
store 選項(xiàng)
sort不是對(duì)原本的對(duì)象在原地進(jìn)行排序,而是使用新數(shù)組來保存排序結(jié)果
使用store選項(xiàng)能將排序結(jié)果,使用list命令來生成Key,key為list類型
127.0.0.1:6379> sort set alpha by *-str limit 0 3 get *-res 1) "tom-result" 2) "cc-result" 3) "jack-result" 127.0.0.1:6379> sort set alpha by *-str limit 0 3 get *-res store setresult (integer) 3 127.0.0.1:6379> type setresult list 127.0.0.1:6379> lrange setresult 0 -1 1) "tom-result" 2) "cc-result" 3) "jack-result"
總結(jié)
本篇文章圍繞Sort命令,深入淺出的解析Sort命令原理以及使用
Sort命令使用新的等長數(shù)組來對(duì)list、set、zset對(duì)象進(jìn)行排序,其中數(shù)組中的節(jié)點(diǎn)RedisSortObject存儲(chǔ)元素地址和權(quán)值,先使用節(jié)點(diǎn)記錄要排序?qū)ο笾性氐牡刂泛蜋?quán)值,再使用快速排序根據(jù)權(quán)值進(jìn)行排序然后返回
默認(rèn)情況下權(quán)值為浮點(diǎn)型,如果是對(duì)字符串類型排序,需要使用alpha選項(xiàng);
想要使用其他key作為權(quán)值排序時(shí)使用by選項(xiàng);
限制結(jié)果集返回使用limit;
想要返回其他key的值時(shí)使用get選項(xiàng);
想存儲(chǔ)結(jié)果并生成列表對(duì)象時(shí)使用store
參考資料
以上就是Redis排序命令Sort深入解析的詳細(xì)內(nèi)容,更多關(guān)于Redis Sort排序命令的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決
這篇文章主要介紹了redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java Socket實(shí)現(xiàn)Redis客戶端的詳細(xì)說明
socket編程是一門技術(shù),它主要是在網(wǎng)絡(luò)通信中經(jīng)常用到.這篇文章主要介紹了如何用Java Socket實(shí)現(xiàn)一個(gè)簡單的Redis客戶端,需要的朋友可以參考下2021-05-05
Redis的setNX分布式鎖超時(shí)時(shí)間失效 -1問題及解決
這篇文章主要介紹了Redis的setNX分布式鎖超時(shí)時(shí)間失效 -1問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
使用Redis實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制
JWT是一種輕量級(jí)的身份驗(yàn)證和授權(quán)機(jī)制,它是一種 JSON 格式的數(shù)據(jù)串,通常用于客戶端和服務(wù)端之間的單點(diǎn)登錄(Single Sign-On, SSO)場(chǎng)景,本文給大家介紹了如何使用Redis來實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制,需要的朋友可以參考下2024-08-08
redis 限制內(nèi)存使用大小的實(shí)現(xiàn)
這篇文章主要介紹了redis 限制內(nèi)存使用大小的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Redisson分布式限流的實(shí)現(xiàn)原理分析
這篇文章主要介紹了Redisson分布式限流的實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

