網站首頁 編程語言 正文
引言
Redis是一款快速、優秀的鍵值對數據庫,提供豐富的數據結構能在各種場景下實現功能,同時也提供豐富的命令來完成各種各樣的功能,本篇文章將深入淺出的解析Sort命令的原理以及使用
原理
Sort 命令用來對list、set、zset對象進行排序,返回排序后的結果
Sort命令會使用一個與原來對象等長的數組,數組中的節點RedisSortObject存儲了元素(指向對應元素)以及權值,排序就是根據權值來排序,權值默認情況下是浮點型,如果要排序的是字符串則權值為字符串對象
等長數組中的RedisSortObject節點會與排序對象中的元素一一對應記錄元素對象的地址和權值
再使用快速排序根據等長數組中RedisSortObject對象中的權值進行排序(默認升序)
注意:排序只在新數組中操作,并沒有改變原來的對象
圖中排序流程對應以下命令操作
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 選項
alpha選項對字符串進行排序,如果對字符串進行排序不使用alpha會報出字符串無法轉換為浮點型(默認浮點型)的異常
使用alpha選項則是對字符串進行排序
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 選項
如果希望不是根據當前集合的元素進行排序,而是根據其他Key來排序則使用 by 選項
by *-value
表示獲取當前元素的key代替*
與-value
拼接得到新的Key,查詢新Key得到的值拿來排序
這種情況下RedisSortObject中記錄的權值為新Key的值
比如當前元素是cc 則新key為 cc-value ,查詢到新key值為88 因此排中間
如果新key結果為字符串 則要使用alpha 選項
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的值為字符串時使用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 選項
limit用來限制返回的數量,使用方式類比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 選項
與by類似,但是by作用的是排序值,而get作用的是返回值
如果希望返回值不是當前元素的值,而是其他key的返回值,則使用get
get *-res
表示獲取當前元素的key代替*
與-res
拼接得到新的Key,查詢新Key得到的值用于返回結果
比如當前元素是cc 則新key為 cc-res ,查詢到新key值為cc-result 因此響應時返回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 選項
sort不是對原本的對象在原地進行排序,而是使用新數組來保存排序結果
使用store選項能將排序結果,使用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"
總結
本篇文章圍繞Sort命令,深入淺出的解析Sort命令原理以及使用
Sort命令使用新的等長數組來對list、set、zset對象進行排序,其中數組中的節點RedisSortObject存儲元素地址和權值,先使用節點記錄要排序對象中元素的地址和權值,再使用快速排序根據權值進行排序然后返回
默認情況下權值為浮點型,如果是對字符串類型排序,需要使用alpha選項;
想要使用其他key作為權值排序時使用by選項;
限制結果集返回使用limit;
想要返回其他key的值時使用get選項;
想存儲結果并生成列表對象時使用store
參考資料
原文鏈接:https://juejin.cn/post/7175395021108019260
相關推薦
- 2022-07-15 使用Android原生WebView+Highcharts實現可左右滑動的折線圖_Android
- 2022-06-27 C#為控件添加自定義事件及自定義觸發_C#教程
- 2023-02-07 C#實現自定義屏保的示例代碼_C#教程
- 2022-08-15 apollo配置中心的client端分析
- 2023-04-18 python去除字符串中的空格、特殊字符和指定字符的三種方法_python
- 2022-11-01 Golang解析yaml文件操作指南_Golang
- 2022-11-21 Kotlin?Fragment的具體使用詳解_Android
- 2022-06-29 Oracle中的常用函數詳解_oracle
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支