網站首頁 編程語言 正文
概述
一些常用命令
- 存儲:zadd key score value
- 獲取:zrange key start end
- 獲取:同時獲取分數:zrange key start end with score
- 刪除:zrem key value
存儲的時候我們可以發現,是有一個score(分數)的,這個就是用來排序的字段。
實現
先說結論,SortedSet底層,根據配置會在不同的時候選用兩種不同的數據結構zset,或ziplist進行存儲:
首先,我們來看幾個參數:
zset-max-ziplist-entries 128 zset-max-ziplist-value 64
if ( field-value對的數量 > ziplist.entries.size || 任意一個filed或value長度 > zset-max-ziplist-value ) { // 使用 zset 進行存儲 } else { // 使用 ziplist 進行存儲
zset的結構如下:
typedef struct zset { dict *dict; zskiplist *zsl; } zset
可以發現,是由字典+跳躍表實現的。
-
zset
結構體里有兩個元素,一個是 dict,用來維護 數據 到 分數 的關系,一個是 zskiplist,用來維護 分數所在鏈表 的關系 -
dict
里通過維護 哈希表 存儲了 張三=>100,李四=>90 的分數關系。
而跳表則是排序的關鍵
跳躍表
先上圖:
我們知道,鏈表的檢索效率是非常低的,如果要拿到100條數據中間的數據,則需要遍歷50個數據才行,為了解決這個問題,跳表應運而生
如上圖,就是常規的跳表,會在原有的數據上加上若干層,指向當前層的下一個節點。
跳表的插入
如上圖所示:其實每個節點的層數是隨機的,而且新插入一個節點不會影響其它節點的層數。因此,插入操作只需要修改插入節點前后的指針,而不需要對很多節點都進行調整。這就降低了插入操作的復雜度。實際上,這是skiplist跳表的一個很重要的特性,這讓它在插入性能上明顯優于平衡樹的方案。
如下圖,假如我們需要查詢23,查詢的路徑如下。
事實上,在插入之前也要先經歷一個類似的查找過程,在確定插入位置后,再完成插入操作。
這也是SortedSet實現排序的原理。
壓縮列表
壓縮列表 ziplist 是為 Redis 節約內存而開發的。
壓縮列表是由一系列特殊編碼的連續內存塊組成的順序型數據結構,一個壓縮列表可以包含任意多個節點 (entry),每個節點可以保存 一個字節數組 或者 一個整數值 。
1、zl bytes
:用于記錄整個壓縮列表占用的內存字節數
2、zl tail
:記錄要列表尾節點距離壓縮列表的起始地址有多少字節
3、zl len
:記錄了壓縮列表包含的節點數量。
4、entryX
:要說列表包含的各個節點
5、zl end
:用于標記壓縮列表的末端
壓縮列表是一種為了節約內存而開發的順序型數據結構
壓縮列表被用作列表鍵和哈希鍵的底層實現之一
壓縮列表可以包含多個節點,每個節點可以保存一個字節數組或者整數值
添加新節點到壓縮列表,可能會引發連鎖更新操作。
原文鏈接:https://blog.csdn.net/qq_42435377/article/details/109396726
相關推薦
- 2022-09-23 Golang分布式應用之Redis示例詳解_Golang
- 2022-03-06 Android系統服務概覽_Android
- 2022-04-05 expected a string (for built-in components) or a c
- 2023-03-26 數據結構TypeScript之棧和隊列詳解_其它
- 2022-09-21 Python安裝和配置uWSGI的詳細過程_python
- 2022-10-27 python中partial庫的使用方法解析_python
- 2023-10-14 C/C++--跨平臺--預定義宏 WIN32、_WIN32、_WIN64
- 2022-04-09 詳解Docker下nginx外掛配置和文件_docker
- 最近更新
-
- 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同步修改后的遠程分支