精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

搞定 Redis 數據存儲原理,別只會Set、Get 了

數據庫 Redis
一開始的時候,我只使用Ht_table[0] 這個散列表讀寫數據,Ht_table[1] 指向 NULL,當這個散列表容量不足,觸發擴容操作,這時候就會創建一個更大的散列表 Ht_table[1]。

在上一篇通過源碼編譯構建出可調式環境之后,想必你想更深入了解我的整體架構。當你熟悉我的整體架構和每個模塊,遇到問題才能直擊本源,直搗黃龍,一笑破蒼穹。

我的核心模塊如圖 1-10。

圖片

  • Client 客戶端,官方提供了 C 語言開發的客戶端,可以發送命令,性能分析和測試等。
  • 網絡層事件驅動模型,基于 I/O 多路復用,封裝了一個短小精悍的高性能 ae 庫,全稱是a simple event-driven programming library。
  • 在 ae 這個庫里面,我通過aeApiState 結構體對 epoll、select、kqueue、evport四種 I/O 多路復用的實現進行適配,讓上層調用方感知不到在不同操作系統實現 I/O 多路復用的差異。
  • Redis 中的事件可以分兩大類:一類是網絡連接、讀、寫事件;另一類是時間事件,也就是特定時間觸發的事件,比如定時執行 rehash 操作。
  • 命令解析和執行層,負責執行客戶端的各種命令,比如SET、DEL、GET等。
  • 內存分配和回收,為數據分配內存,提供不同的數據結構保存數據。
  • 持久化層,提供了 RDB 內存快照文件 和 AOF 兩種持久化策略,實現數據可靠性。
  • 高可用模塊,提供了副本、哨兵、集群實現高可用。
  • 監控與統計,提供了一些監控工具和性能分析工具,比如監控內存使用、基準測試、內存碎片、bigkey 統計、慢指令查詢等。

掌握了整體架構和模塊后,接下來進入 src 源碼目錄,使用如下指令執行 redis-server可執行程序啟動 Redis。

./redis-server ../redis.conf

每個被啟動的服務我都會抽象成一個 redisServer,源碼定在server.h 的redisServer 結構體。

這個結構體包含了存儲鍵值對的數據庫實例、redis.conf 文件路徑、命令列表、加載的 Modules、網絡監聽、客戶端列表、RDB AOF 加載信息、配置信息、RDB 持久化、主從復制、客戶端緩存、數據結構壓縮、pub/sub、Cluster、哨兵等一些列 Redis 實例運行的必要信息。

結構體字段很多,不再一一列舉,部分核心字段如下。

truct redisServer {
pid_t pid; /* 主進程 pid. */
pthread_t main_thread_id; /* 主線程 id */
char *configfile; /*redis.conf 文件絕對路徑*/
redisDb *db; /* 存儲鍵值對數據的 redisDb 實例 */
int dbnum; /* DB 個數 */
dict *commands; /* 當前實例能處理的命令表,key 是命令名,value 是執行命令的入口 */
aeEventLoop *el;/* 事件循環處理 */
int sentinel_mode; /* true 則表示作為哨兵實例啟動 */

/* 網絡相關 */
int port;/* TCP 監聽端口 */
list *clients; /* 連接當前實例的客戶端列表 */
list *clients_to_close; /* 待關閉的客戶端列表 */

client *current_client; /* 當前執行命令的客戶端*/
};

數據存儲原理

其中redisDb *db指針非常重要,它指向了一個長度為 dbnum(默認 16)的 redisDb 數組,它是整個存儲的核心,我就是用這玩意來存儲鍵值對。

redisDb

redisDb 結構體定義如下。

typedef struct redisDb {
dict *dict;
dict *expires;
dict *blocking_keys;
dict *ready_keys;
dict *watched_keys;
int id;
long long avg_ttl;
unsigned long expires_cursor;
list *defrag_later;
clusterSlotToKeyMapping *slots_to_keys;
} redisDb;

dict 和 expires

  • dict 和 expires 是最重要的兩個屬性,底層數據結構是字典,分別用于存儲鍵值對數據和 key 的過期時間。
  • expires,底層數據結構是 dict 字典,存儲每個 key 的過期時間。

?

MySQL:“為什么分開存儲?”

好問題,之所以分開存儲,是因為過期時間并不是每個 key 都會設置,它不是鍵值對的固有屬性,分開后雖然需要兩次查找,但是能節省內存開銷。

blocking_keys 和 ready_keys

底層數據結構是 dict 字典,主要是用于實現 BLPOP 等阻塞命令。

當客戶端使用 BLPOP 命令阻塞等待取出列表元素的時候,我會把 key 寫到 blocking_keys 中,value 是被阻塞的客戶端。

當下一次收到 PUSH 命令執時,我會先檢查 blocking_keys 中是否存在阻塞等待的 key,如果存在就把 key 放到 ready_keys 中,在下一次 Redis 事件處理過程中,會遍歷 ready_keys 數據,并從 blocking_keys 中取出阻塞的客戶端響應。

watched_keys

用于實現 watch 命令,存儲 watch 命令的 key。

id

Redis 數據庫的唯一 ID,一個 Redis 服務支持多個數據庫,默認 16 個。

avg_ttl

用于統計平均過期時間。

expires_cursor

統計過期事件循環執行的次數。

defrag_later

保存逐一進行碎片整理的 key 列表。

slots_to_keys

僅用于 Cluster 模式,當使用 Cluster 模式的時候,只能有一個數據庫 db 0。slots_to_keys 用于記錄 cluster 模式下,存儲 key 與哈希槽映射關系的數組。

dict

Redis 使用 dict 結構來保存所有的鍵值對(key-value)數據,這是一個散列表,所以 key 查詢時間復雜度是 O(1) 。

所謂散列表,我們可以類比 Java 中的 HashMap,其實就是一個數組,數組的每個元素叫做哈希桶。

dict 結構體源碼在 dict.h 中定義。

struct dict {
dictType *type;

dictEntry **ht_table[2];
unsigned long ht_used[2];

long rehashidx;

int16_t pauserehash;
signed char ht_size_exp[2];
};

dict 的結構體里,有 dictType *type,**ht_table[2],long rehashidx 三個很重要的結構。

  • type 存儲了 hash 函數,key 和 value 的復制等函數;
  • ht_table[2],長度為 2 的數組,默認使用 ht_table[0] 存儲鍵值對數據。我會使用 ht_table[1] 來配合實現漸進式 reahsh 操作。
  • rehashidx 是一個整數值,用于標記是否正在執行 rehash 操作,-1 表示沒有進行 rehash。如果正在執行 rehash,那么其值表示當前 rehash 操作執行的 ht_table[1] 中的 dictEntry 數組的索引。
  • pauserehash 表示 rehash 的狀態,大于 0 時表示 rehash 暫停了,小于 0 表示出錯了。
  • ht_used[2],長度為 2 的數組,表示每個哈希桶存儲了多少個 鍵值對實體(dictEntry),值越大,哈希沖突的概率越高。
  • ht_size_exp[2],每個散列表的大小,也就是哈希桶個數。

重點關注 ht_table 數組,數組每個位置叫做哈希桶,就是這玩意保存了所有鍵值對,每個哈希桶的類型是 dictEntry。

?

MySQL:“Redis 支持那么多的數據類型,哈希桶咋保存?”

他的玄機就在 dictEntry 中,每個 dict 有兩個 ht_table,用于存儲鍵值對數據和實現漸進式 rehash。

dictEntry 結構如下。

typedef struct dictEntry {
void *key;
union {
// 指向實際 value 的指針
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
// 散列表沖突生成的鏈表
struct dictEntry *next;
void *metadata[];
} dictEntry;

  • *key 指向鍵值對的鍵的指針,指向一個 sds 對象,key 都是 string 類型。
  • v 是鍵值對的 value 值,是個 union(聯合體),當它的值是 uint64_t、int64_t 或 double 數字類型時,就不再需要額外的存儲,這有利于減少內存碎片。(為了節省內存操碎了心)當值為非數字類型,就是用val 指針存儲。
  • *next指向另一個 dictEntry 結構, 多個 dictEntry 可以通過 next 指針串連成鏈表, 從這里可以看出, ht_table 使用鏈地址法來處理鍵碰撞:當多個不同的鍵擁有相同的哈希值時,哈希表用一個鏈表將這些鍵連接起來。

哈希桶并沒有保存值本身,而是指向具體值的指針,從而實現了哈希桶能存不同數據類型的需求。

redisObject

dictEntry 的 *val 指針指向的值實際上是一個 redisObject 結構體,這是一個非常重要的結構體。

我的 key 只能是字符串類型,而 value 可以是 String、Lists、Set、Sorted Set、散列表等數據類型。

鍵值對的值都被包裝成 redisObject 對象, redisObject 在 server.h 中定義。

typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
} robj;

  • type:記錄了對象的類型,string、set、hash 、Lis、Sorted Set 等,根據該類型來確定是哪種數據類型,使用什么樣的 API 操作。
  • encoding:編碼方式,表示 ptr 指向的數據類型具體數據結構,即這個對象使用了什么數據結構作為底層實現保存數據。同一個對象使用不同編碼實現內存占用存在明顯差異,內部編碼對內存優化非常重要。
  • lru:LRU_BITS:LRU 策略下對象最后一次被訪問的時間,如果是 LFU 策略,那么低 8 位表示訪問頻率,高 16 位表示訪問時間。
  • refcount:表示引用計數,由于 C 語言并不具備內存回收功能,所以 Redis 在自己的對象系統中添加了這個屬性,當一個對象的引用計數為 0 時,則表示該對象已經不被任何對象引用,則可以進行垃圾回收了。
  • ptr 指針:指向對象的底層實現數據結構,指向值的指針

如圖 1-11 是由 redisDb、dict、dictEntry、redisObejct 關系圖:

圖片

注意,一開始的時候,我只使用 ht_table[0] 這個散列表讀寫數據,ht_table[1] 指向 NULL,當這個散列表容量不足,觸發擴容操作,這時候就會創建一個更大的散列表 ht_table[1]。

接著我會使用漸進式 rehash 的方式將 ht_table[0] 的數據遷移到 ht_table[1] 上,全部遷移完成后,再修改下指針,讓 ht_table[0] 指向擴容后的散列表,回收掉原來的散列表,ht_table[1] 再次指向 NULL。

責任編輯:姜華 來源: 碼哥字節
相關推薦

2020-10-10 06:25:36

日志原理搜索

2025-10-13 02:00:00

2025-05-28 03:00:00

2018-08-16 10:01:40

數據存儲數據中心

2018-09-28 09:32:57

2025-06-09 02:00:00

項目技術棧Spring

2024-11-08 13:24:43

2024-01-19 12:48:00

Redis存儲數據庫

2009-09-11 09:15:32

C# get set

2021-08-31 07:02:34

數據響應Vue偵測數據變化

2023-04-27 08:40:55

Redis數據結構存儲

2009-09-10 16:38:43

C# get set用

2019-01-08 11:57:10

Redis存儲數據結構

2023-10-23 11:22:06

Redis數據持久化

2021-01-11 15:02:27

Redis數據庫命令

2020-04-07 08:00:02

Redis緩存數據

2023-11-09 16:20:32

Vue.jsReact前端

2018-04-27 09:03:57

Redis數據存儲

2023-02-13 14:11:25

ChatGPT微軟

2017-04-24 14:00:03

點贊
收藏

51CTO技術棧公眾號

亚洲爆乳无码精品aaa片蜜桃| 国产精品九九九| 性囗交免费视频观看| 中文字幕在线直播| 中文字幕字幕中文在线中不卡视频| www.久久草| 亚洲精品成人在线视频| 亚洲精品国产首次亮相| 日韩精品视频在线观看免费| 日韩成人精品视频在线观看| av资源网在线播放| 亚洲婷婷国产精品电影人久久| 国产美女在线精品免费观看| 在线观看视频二区| 亚洲一区二区动漫| 欧美精品一区二区三区国产精品| 亚洲人成人无码网www国产| 国产一区二区三区精品在线观看 | 国产日韩欧美在线观看视频| 亚州综合一区| 欧美哺乳videos| 四季av一区二区三区| 色综合桃花网| 亚洲午夜三级在线| 中文字幕中文字幕在线中一区高清 | 亚洲综合日韩| 欧美精品久久久久a| 国产精品久久久久久成人| 欧美有码在线| 亚洲成av人片在线观看香蕉| 一二三av在线| 精品176极品一区| 色婷婷av一区二区三区之一色屋| 蜜臀av色欲a片无码精品一区| 成人影院在线观看| 国产精品电影院| 日韩欧美三级一区二区| 手机看片福利在线观看| 成人午夜在线播放| 国产传媒一区| 亚洲AV无码一区二区三区少妇| 精东粉嫩av免费一区二区三区| 国产精品久久激情| 久久久久久亚洲av无码专区| 久久国产精品毛片| 日本免费在线精品| 在线观看污污网站| 国产精品日本| 欧美与黑人午夜性猛交久久久| 一级免费在线观看| 国产视频一区三区| 97超碰蝌蚪网人人做人人爽| 国产成人无码精品久久久久| 99国产精品| 欧美在线观看网站| 波多野结衣视频在线观看| 日韩国产在线一| 国产精品自产拍在线观看中文 | 日韩电影在线观看电影| 国产ts人妖一区二区三区| 亚洲婷婷综合网| 日韩精品亚洲专区| 成人激情视频网| 亚洲熟女乱色一区二区三区久久久| 免费看欧美美女黄的网站| 国产精品中文字幕在线| 国产免费一区二区三区免费视频| 国产一区二区三区在线观看精品 | 午夜伊人狠狠久久| 日本www在线播放| 激情开心成人网| 欧美日韩一区精品| 国产免费无码一区二区| 蜜桃久久久久| 一区国产精品视频| 久久爱一区二区| 黄色亚洲精品| 国产精品高清在线观看| 国产伦理一区二区| av亚洲精华国产精华精华 | 国产在线观看网站| 中文字幕中文字幕中文字幕亚洲无线| 少妇熟女一区二区| 乱馆动漫1~6集在线观看| 91久久精品一区二区二区| 亚洲精品永久视频| 人人精品视频| 色阁综合伊人av| 国产中文字字幕乱码无限| 日韩精品久久理论片| 亚洲www视频| 你懂的好爽在线观看| ...xxx性欧美| 日本成年人网址| 精品欧美视频| 亚洲欧洲午夜一线一品| 国产高潮国产高潮久久久91| 久久精品一区| 国产精品一级久久久| www日韩tube| 亚洲成人一区二区| 在线观看岛国av| 亚洲区小说区图片区qvod| 久久久国产精品x99av| 日本三级小视频| 国产乱人伦精品一区二区在线观看| 精品日韩欧美| 欧美性爽视频| 欧美日本一区二区| av在线网站观看| 欧美三级网页| 91日本在线观看| 国产福利小视频在线| 亚洲成av人片一区二区三区| 久热精品在线播放| 久久av资源| 1769国内精品视频在线播放| va婷婷在线免费观看| 国产女主播一区| av动漫在线看| 国产91精品入| 欧美黑人狂野猛交老妇| 亚洲一卡二卡在线| 久久精品一二三| 欧美精品一区二区三区三州| 香港久久久电影| 久久天天躁夜夜躁狠狠躁2022| 精人妻无码一区二区三区| 91麻豆文化传媒在线观看| 久久99久久久久久| 综合久久成人| 欧美日本亚洲视频| 国产三级三级在线观看| 国产精品国产三级国产普通话蜜臀 | 国产呦精品一区二区三区网站| 亚洲国产午夜伦理片大全在线观看网站| 亚洲优女在线| 亚洲美女久久久| 国产精品久免费的黄网站| 99精品视频在线观看免费| 久久99久久99精品| 盗摄牛牛av影视一区二区| 精品中文字幕在线2019| 99久久久久成人国产免费| 日韩毛片高清在线播放| 做a视频在线观看| 香蕉国产精品| 99porn视频在线| 免费看电影在线| 精品福利一二区| 久久99久久98精品免观看软件 | 国产欧美亚洲日本| ****av在线网毛片| 国产视频丨精品|在线观看| 国产在线观看黄色| 国产无人区一区二区三区| 爆乳熟妇一区二区三区霸乳| 日韩精品欧美| 51国偷自产一区二区三区的来源| 四虎影视国产在线视频| 精品国产免费人成在线观看| 日韩伦人妻无码| 久久欧美中文字幕| 无尽裸体动漫2d在线观看| 久久久久美女| 国产一区二区在线网站 | 亚洲欧美亚洲| 精品国产中文字幕| 电影亚洲一区| 美女精品久久久| 性xxxx视频| 欧洲精品一区二区| 免费中文字幕在线| 91视频精品在这里| 中文字幕在线综合| 国产综合色产| 日本一区二区三区精品视频| 国产高清日韩| 欧美一区二三区| 久久久久久国产精品免费无遮挡| 精品少妇一区二区三区视频免付费| 日产精品久久久| 一区在线观看免费| 偷偷色噜狠狠狠狠的777米奇| 日韩精品一区第一页| 超级碰在线观看| 免费视频亚洲| 亚洲自拍偷拍网址| 色婷婷综合久久久中字幕精品久久| 久久精品国产精品| 亚洲人视频在线观看| 欧美日韩国产大片| 久草视频在线观| 亚洲欧美色综合| 免费在线观看你懂的| 黄页网站大全一区二区| 男女高潮又爽又黄又无遮挡| 51精产品一区一区三区| 免费成人看片网址| jizz18欧美18| 国产精品亚洲片夜色在线| 2019中文字幕在线电影免费| 少妇高潮久久久久久潘金莲| 天堂影院在线| 精品乱人伦小说| 97人人爽人人爽人人爽| 欧美性猛交xxxx| 久久精品国产亚洲av高清色欲| 亚洲国产激情av| 亚洲成人日韩在线| 成人激情av网| 黄色片免费网址| 免费xxxx性欧美18vr| 男人和女人啪啪网站| 欧美色一级片| 少妇高潮流白浆| 日韩电影二区| 欧美一区二区三区四区五区六区| 国产一区在线电影| 5566av亚洲| 精品伊人久久| 国产欧美va欧美va香蕉在| 国产另类xxxxhd高清| 91国产精品91| 不卡专区在线| 欧美精品xxx| 日本性爱视频在线观看| 久久国产精品久久精品| 在线免费黄色| 中文字幕无线精品亚洲乱码一区| 青青草手机在线| 日韩精品在线观看一区| 你懂的网站在线| 欧美精品一区二区三区蜜桃| 亚洲精品成av人片天堂无码 | 亚洲一二三专区| 欧美 日韩 国产 一区二区三区| 国产精品亲子乱子伦xxxx裸| 免费视频91蜜桃| 国产清纯白嫩初高生在线观看91 | 黄a在线观看| 久久久999精品| 中文字幕在线播放| 日韩在线欧美在线国产在线| 免费在线观看黄| 久久午夜a级毛片| 国产盗摄在线观看| 欧美成人一区在线| 天堂av最新在线| 韩国日本不卡在线| 免费看av不卡| 国产精品网红福利| 韩国一区二区三区视频| 亚洲一区二区免费| h视频久久久| 蜜桃麻豆www久久国产精品| 色棕色天天综合网| 日韩资源av在线| 久久久久久影院| 国产中文字幕乱人伦在线观看| 伊人久久婷婷| 久久国产色av免费观看| 久久精品国产免费看久久精品| 久久久精品高清| 国产jizzjizz一区二区| 国产精品jizz| 亚洲欧美在线视频| 久久精品久久国产| 色综合天天天天做夜夜夜夜做| 国产乱码77777777| 91麻豆精品国产91久久久久久| 精品黑人一区二区三区国语馆| 日韩精品在线免费观看视频| 成人午夜影视| 欧美国产在线电影| 综合在线影院| www.成人av| 免费精品国产| 日韩不卡视频一区二区| 国产一区成人| 欧美成人乱码一二三四区免费| 粉嫩aⅴ一区二区三区四区五区 | 亚洲男人电影天堂| 日干夜干天天干| 欧美日韩日日夜夜| 日韩在线观看视频一区| 中文国产成人精品| 17videosex性欧美| 成人美女免费网站视频| 台湾佬综合网| 玖玖精品在线视频| 久久久噜噜噜| 中文字幕在线视频播放| 国产精品美女久久福利网站| av大片免费在线观看| 欧美一区二区三区四区高清| 日韩在线观看视频网站| 久久婷婷国产麻豆91天堂| 日韩a**中文字幕| 国产精品久久久久久久久久久久冷 | 亚洲成人aaa| 国内精品久久久久国产| 日本精品久久久| 99久久婷婷国产综合精品青牛牛 | 精品电影一区| 亚洲天堂网2018| 国产日韩欧美麻豆| 国产一级做a爱片久久毛片a| 日韩一级黄色片| 1区2区3区在线观看| 日本韩国欧美精品大片卡二| 操欧美女人视频| 中文字幕色呦呦| 老司机精品视频一区二区三区| 久久久久麻豆v国产精华液好用吗| 亚洲视频 欧洲视频| 国产一级片一区二区| 日韩国产精品视频| av午夜在线观看| 成人女人免费毛片| 欧美在线首页| 中文字幕精品一区二区三区在线| 久久久久久免费网| 九九热精品视频在线| 亚洲精品99久久久久中文字幕| 伊人福利在线| 99久久99久久| 韩国av一区| 免费黄视频在线观看| 亚洲欧美偷拍三级| 国产精品亚洲欧美在线播放| 日韩在线观看免费网站 | 日韩国产欧美视频| 伊人网在线视频观看| 日本国产一区二区| 国产youjizz在线| 国产精品va在线播放| 深夜福利久久| 91香蕉视频污版| 国产精品天美传媒| 一级全黄裸体免费视频| 视频在线一区二区| 99er精品视频| 久久国产精品免费观看| 国产成人av网站| 久草视频在线免费看| 精品国产乱码久久久久久图片| 精品一性一色一乱农村| 国产精品嫩草在线观看| 亚洲精品一二| 美女100%无挡| 欧美日韩三级视频| 黄色动漫在线观看| yy111111少妇影院日韩夜片| 在线看片日韩| 免费观看av网站| 欧美丝袜丝nylons| 黄av在线免费观看| 国产欧美在线一区二区| 99香蕉国产精品偷在线观看| 女人又爽又黄免费女仆| 欧美午夜在线一二页| 黄色精品在线观看| 国产精品免费一区二区三区在线观看 | 一区二区三区四区不卡在线| 日批免费在线观看| 国产成+人+综合+亚洲欧美丁香花| 精品产国自在拍| 亚洲国产午夜精品| 亚洲成av人在线观看| 国产高清免费av在线| 亚洲一区美女视频在线观看免费| 亚洲午夜91| 亚洲女优在线观看| 日韩女优视频免费观看| 女厕盗摄一区二区三区| 天天综合色天天综合色hd| 国产毛片精品一区| 久久久久久不卡| 超碰91人人草人人干| 性欧美lx╳lx╳| 五月天激情播播| 欧美性xxxxx极品| 黄色免费网站在线| 欧美日韩精品不卡| 国产一区二区福利| 黄色片中文字幕| 欧美成在线视频| 国产成人影院| 麻豆精品国产传媒| 欧美在线免费观看视频| 欧美人与动牲性行为| 午夜视频久久久| 99久久综合精品| 国产青青草视频| 日本亚洲欧洲色| 亚洲区一区二| 欧美国产日韩在线观看成人| 永久免费精品影视网站| 91蝌蚪精品视频|