網站首頁 編程語言 正文
RedisDb
Redis服務器默認有16個數據庫,一個數據庫對應一個RedisDB數據結構。
typedef struct redisDb { dict *dict; dict *expires; dict * blocking_keys; dict * ready_keys; dict * watched_keys; ...... }
- dict:鍵空間散列表,用于存放所有鍵值對
- expires:過期時間散列表,存放鍵的過期時間
- blocking_keys:處于阻塞狀態的鍵和對應的client
- ready_keys:解除阻塞狀態的鍵和對應的client,與blocking_keys屬性相對
- watched_keys:watch的鍵和對應的client,主要用于事務
RedisObject
Redis的鍵值都是redisObject對象,每次當我們在Redis的數據庫中新創建一個鍵值對時,會生成一個用于鍵名的redisObject對象和一個用于鍵值的redisObject對象
trpedef struct RedisObject { int4 type; int4 encoding; void *ptr; int24 lru; int32 refcount; }
字段 | 描述 | 說明 |
---|---|---|
type | 用于表示Redis對應的類型 | string、list、hash、set、zset、stream等,用枚舉表示 |
encoding | 內部編碼 | int,embstr,raw,hashtable,quicklist, ziplist,intset,skiplist等,用枚舉表示 |
lru | 24位,可選LFU或LRU | 當為LRU時,表示最后一次訪問時間;當為LFU時,高16位用來表示分鐘級別的訪問時間,低8位用來表示訪問頻次,頻次的增加使用的是概率算法,基數越大越難增加;訪問時間更新時,存在一定概率將訪問頻次衰減。(兩者共有)訪問時間是對一個數取模,當前時間也取模, 當前時間大于訪問時間,則為兩數之差;當前時間小于訪問時間,則為當前時間加上模數與訪問時間之差 |
refcount | 引用計數 | 初始值為1,實際應用中參考意義不大 |
ptr | 指針,占8個字節,指向數據的地址 | dict、expires等,指針指向同一個地址 |
object
命令,就是對RedisObject的相關操作。
修改內存淘汰策略
object idletime key # 返回key的空閑時間,即上次讀寫鍵以來經過的近似描述,在lfu模式下不可用
config set maxmemory-policy volatile-lfu # 修改內存淘汰策略 set name zhangsan object freq name # 獲取計數值,僅lfu模式下可用,初始化為5 get name object freq name # 再次訪問,返回為6
int
當string值為整數并且小于等于long的最大值時,encoding為int類型,ptr直接指向該int型地址
embstr與raw
Redis的字符串叫SDS(Simple Dynamic String,簡單字符串),對應key,非整數型的String值
trpedef struct SDS { int8 capacity; // 數組容量 int8 len; // 實際長度 int8 flags; byte[] content; // 數組內容 }
可以看出,SDS與Java的ArrayList結構類似,也是分配初始長度,長度超出時擴容。Redis規定字符串的長度不能超過512M。
當長度特別短時,使用embstr形式存儲;當長度超出44字節時,使用raw形式存儲。
已知內存分配器最大分配單位是64字節,RedisObject占16個字節,SDS標識占3個字節,字符串以NULL結尾需要占用一個字節,因此當字符串長度小于等于44時,只需要分配一次內存。RedisObject與SDS在同一內存單位,我們將這種數據結構稱為embstr,而不在同一內存單位的,稱為raw。
dict
dict(encoding編碼為hashtable類型,字典)對應hash、set、zset(用于存儲value與score的映射)集合。
dict與Java的HashMap結構類似,不同的是HashMap擴容是申請數組,然后遍歷,將舊數據重新hash后掛到數組下面,作為單線程的Redis很難承受這樣耗時的過程,所以它使用了兩個數組,先返回,然后空閑的時候一點一點搬數據,搬完之后再將舊數據清空,我們將這樣的過程成為漸進式rehash。
typedef struct dict { dictht ht[2]; }
原文鏈接:https://juejin.cn/post/7048603894728884255
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-05-25 從零搭建開發腳手架 SpringBoot自定義配置的多種姿勢及Idea自動提示
- 2022-08-14 PyTorch中torch.utils.data.DataLoader簡單介紹與使用方法_pytho
- 2023-07-27 原型和原型鏈條、ES6、前后端交互Ajax
- 2023-05-24 Golang實現AES對稱加密算法實例詳解_Golang
- 2022-03-16 C語言下快速排序(挖坑法)詳解_C 語言
- 2023-08-13 微信小程序底部導航欄最多只能顯示五個,解決辦法
- 2023-02-10 python中的list?查找與過濾方法整合_python
- 2023-01-02 Python創建相同值數組/列表的兩種方法_python
- 欄目分類
-
- 最近更新
-
- 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同步修改后的遠程分支