網(wǎng)站首頁 編程語言 正文
概述
一些常用命令
- 存儲:zadd key score value
- 獲取:zrange key start end
- 獲?。和瑫r獲取分數(shù):zrange key start end with score
- 刪除:zrem key value
存儲的時候我們可以發(fā)現(xiàn),是有一個score(分數(shù))的,這個就是用來排序的字段。
實現(xiàn)
先說結(jié)論,SortedSet底層,根據(jù)配置會在不同的時候選用兩種不同的數(shù)據(jù)結(jié)構(gòu)zset,或ziplist進行存儲:
首先,我們來看幾個參數(shù):
zset-max-ziplist-entries 128 zset-max-ziplist-value 64
if ( field-value對的數(shù)量 > ziplist.entries.size || 任意一個filed或value長度 > zset-max-ziplist-value ) { // 使用 zset 進行存儲 } else { // 使用 ziplist 進行存儲
zset的結(jié)構(gòu)如下:
typedef struct zset { dict *dict; zskiplist *zsl; } zset
可以發(fā)現(xiàn),是由字典+跳躍表實現(xiàn)的。
-
zset
結(jié)構(gòu)體里有兩個元素,一個是 dict,用來維護 數(shù)據(jù) 到 分數(shù) 的關(guān)系,一個是 zskiplist,用來維護 分數(shù)所在鏈表 的關(guān)系 -
dict
里通過維護 哈希表 存儲了 張三=>100,李四=>90 的分數(shù)關(guān)系。
而跳表則是排序的關(guān)鍵
跳躍表
先上圖:
我們知道,鏈表的檢索效率是非常低的,如果要拿到100條數(shù)據(jù)中間的數(shù)據(jù),則需要遍歷50個數(shù)據(jù)才行,為了解決這個問題,跳表應(yīng)運而生
如上圖,就是常規(guī)的跳表,會在原有的數(shù)據(jù)上加上若干層,指向當前層的下一個節(jié)點。
跳表的插入
如上圖所示:其實每個節(jié)點的層數(shù)是隨機的,而且新插入一個節(jié)點不會影響其它節(jié)點的層數(shù)。因此,插入操作只需要修改插入節(jié)點前后的指針,而不需要對很多節(jié)點都進行調(diào)整。這就降低了插入操作的復(fù)雜度。實際上,這是skiplist跳表的一個很重要的特性,這讓它在插入性能上明顯優(yōu)于平衡樹的方案。
如下圖,假如我們需要查詢23,查詢的路徑如下。
事實上,在插入之前也要先經(jīng)歷一個類似的查找過程,在確定插入位置后,再完成插入操作。
這也是SortedSet實現(xiàn)排序的原理。
壓縮列表
壓縮列表 ziplist 是為 Redis 節(jié)約內(nèi)存而開發(fā)的。
壓縮列表是由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),一個壓縮列表可以包含任意多個節(jié)點 (entry),每個節(jié)點可以保存 一個字節(jié)數(shù)組 或者 一個整數(shù)值 。
1、zl bytes
:用于記錄整個壓縮列表占用的內(nèi)存字節(jié)數(shù)
2、zl tail
:記錄要列表尾節(jié)點距離壓縮列表的起始地址有多少字節(jié)
3、zl len
:記錄了壓縮列表包含的節(jié)點數(shù)量。
4、entryX
:要說列表包含的各個節(jié)點
5、zl end
:用于標記壓縮列表的末端
壓縮列表是一種為了節(jié)約內(nèi)存而開發(fā)的順序型數(shù)據(jù)結(jié)構(gòu)
壓縮列表被用作列表鍵和哈希鍵的底層實現(xiàn)之一
壓縮列表可以包含多個節(jié)點,每個節(jié)點可以保存一個字節(jié)數(shù)組或者整數(shù)值
添加新節(jié)點到壓縮列表,可能會引發(fā)連鎖更新操作。
原文鏈接:https://blog.csdn.net/qq_42435377/article/details/109396726
相關(guān)推薦
- 2021-12-09 Android音頻開發(fā)之錄制音頻(WAV及MP3格式)_Android
- 2022-07-13 4:thingsboard的實體與關(guān)系
- 2021-12-06 Android優(yōu)化提升應(yīng)用啟動速度及Splash頁面的設(shè)計_Android
- 2022-11-22 Golang自旋鎖的相關(guān)介紹_Golang
- 2022-08-28 Golang正則表達式判斷手機號或身份證方法實例_Golang
- 2022-12-02 C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)_C 語言
- 2023-07-26 webpack中plugin的工作原理
- 2022-04-25 C++特殊成員函數(shù)以及其生成機制詳解_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支