網站首頁 編程語言 正文
1. Redis 底層數據結構
Redis數據庫就像是一個哈希表,首先對key進行哈希運算得到哈希值再取模得到一個下標,每個元素是一個節點,節點之間形成鏈表。這感覺有點像Java中的HashMap。
不同的數據類型的實現方式是不一樣的,可以通過object encoding命令查看底層真正的數據存儲結構
同一種類型在不同的條件下所采用的數據結構也不一樣,例如:
Redis是鍵值對形式的數據庫,key可以是任意值(PS:最終都會轉成string),value有多種數據類型
詳見:https://redis.io/docs/manual/data-types/data-types-tutorial/
至此,已經很清楚,hash底層的結構是 ziplist 和 hashtable
那么,什么時候會從ziplist轉成hashtable呢?這個在redis.conf中有相關的配置,如下:
默認情況下:
當ziplist中entry的數量超過512的時候,會轉成hashtable 單個元素的值超過64字節的時候,會轉成hashtable
2. hashtable
在Redis中hashtable就是字典dict
通過源碼,可以看到dict是這樣定義的:
3. redisDb 與 redisObject
通過源碼得知,redisDb代表redis數據庫,redisObject代表存到數據庫中的數據
字典dict的結構前面已經看過了,于是整個數據庫的結構大概就是下面這個樣子:
?
4. ziplist
ziplist是一種特殊編碼的雙鏈表,被設計成非常節省內存。它存儲字符串和整型值,其中整數被編碼為實際整數,而不是一系列字符。它允許在O(1)時間內在列表的任意一邊進行push和pop操作。但是,由于每個操作都需要重新分配ziplist所使用的內存,因此實際的復雜性與ziplist所使用的內存量有關。
ziplist的大體布局如下:
<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
<uint32_t zlbytes>: 一個無符號整數,用于保存ziplist占用的字節數,包括zlbytes字段本身的四個字節。需要存儲這個值,以便能夠調整整個結構的大小,而不需要首先遍歷它。
<uint32_t zltail> : 列表中最后一個條目的偏移量。
<uint16_t zllen> ?: 條目的數量。當有超過2^16-2個條目時,這個值被設置為2^16-1,我們需要遍歷整個列表來知道它包含多少項。
<uint8_t zlend> : 一個特殊的條目,表示 ziplist 的結尾
?
5. linkedlist
linkedlist是一個雙向鏈表
?
6. quicklist
quicklistNode是一個32字節的結構體,描述快表的ziplist。
quicklist = linkedlist + ziplist
原文鏈接:https://www.cnblogs.com/cjsblog/p/16526256.html
相關推薦
- 2022-10-22 C#中的屬性解析(get、set、value)_C#教程
- 2022-06-07 nlp計數法應用于PTB數據集示例詳解_python
- 2023-02-27 python定時任務sched庫用法簡單實例_python
- 2022-07-16 Vscode 設置clang-format
- 2022-11-08 PostgreSQL查看帶有綁定變量SQL的通用方法詳解_PostgreSQL
- 2022-07-13 Docker之Harbor私有倉庫
- 2022-12-15 C++?boost?scoped_ptr智能指針詳解_C 語言
- 2022-10-29 CSS 漸變彩色字體
- 最近更新
-
- 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同步修改后的遠程分支