精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲三级在线免费观看| 日韩中文字幕av电影| 精品国产乱码久久久久久蜜臀| 国产一级做a爰片久久毛片男| 天堂8在线视频| 爽好多水快深点欧美视频| 中文字幕亚洲精品| 亚洲一二三四五| 深夜成人影院| 一区二区三区产品免费精品久久75| 国产三区精品| 一区二区三区精| 亚洲精品护士| 久久精品电影网站| av无码av天天av天天爽| 亚洲伦理网站| 一本大道久久a久久综合| 99精品一区二区三区的区别| 视频一区二区在线播放| 九九国产精品视频| 欧美一区二区三区……| 农村黄色一级片| 精品一级毛片| 日韩av在线网站| 男人午夜视频在线观看| 日本欧美日韩| 亚洲国产欧美另类丝袜| 福利网在线观看| 91sp网站在线观看入口| 26uuu国产日韩综合| 成人做爰66片免费看网站| 中文字幕码精品视频网站| 在线亚洲免费| 欧美国产第一页| 天天综合天天做| 色综合狠狠操| 自拍亚洲一区欧美另类| 女尊高h男高潮呻吟| 天堂av一区| 欧美日韩亚洲高清一区二区| 丁香啪啪综合成人亚洲| 男女视频在线| 亚洲精品国产第一综合99久久| 蜜桃视频日韩| 天堂av在线免费| 成人午夜伦理影院| 成人三级在线| 亚洲国产福利视频| 国产a区久久久| 99一区二区| 亚洲大尺度网站| 国产成人免费网站| 99porn视频在线| 国产白浆在线观看| 国产一区二区三区黄视频 | 精品成人18| 在线播放中文字幕一区| 中文av一区二区三区| yiren22亚洲综合| 欧美日韩视频一区二区| 一区二区免费av| 国产一区二区| 精品国产免费一区二区三区香蕉| 成人做爰69片免费| 精品一区二区男人吃奶| 亚洲精品成人久久久| 特大黑人巨人吊xxxx| 欧美极品中文字幕| 日韩在线观看免费全| 黄色录像二级片| 欧美在线看片| 性欧美办公室18xxxxhd| www.久久久久久久| 六月丁香综合在线视频| 亚洲一区二区三区sesese| 精品国产乱码久久久久久蜜臀网站| 国产高清一区日本| 九九九九九九精品| 国产精品一级伦理| 亚洲欧美一区二区久久| 国产高清av在线播放| 成人欧美大片| 91精品国产欧美日韩| 三级网站免费看| 日韩美女国产精品| 最新的欧美黄色| 久草资源在线视频| 久久天堂精品| 91在线直播亚洲| 手机福利在线| 亚洲色图都市小说| 99久久久无码国产精品6| 国产福利亚洲| 亚洲精品电影在线观看| jizzjizz日本少妇| 日韩图片一区| 成人国产亚洲精品a区天堂华泰| 亚洲国产欧美另类| 国产欧美精品区一区二区三区| 一区二区三区四区免费观看| 成人影院大全| 欧美大片在线观看一区二区| 日韩在线免费观看av| 欧美一区二区| 国产精品v片在线观看不卡| 国产成人毛毛毛片| 国产亚洲精品久| 欧妇女乱妇女乱视频| 在线成人视屏| 亚洲国产精品成人av| 一级片一级片一级片| 久久久青草婷婷精品综合日韩| 91中文字幕在线| 国产特黄在线| 精品女厕一区二区三区| 手机精品视频在线| 成人av国产| 77777亚洲午夜久久多人| 国产精品无码天天爽视频| 久久青草欧美一区二区三区| 欧美黄网在线观看| 亚洲福利影视| 国产一区二区欧美日韩| 在线观看免费国产视频| 国产高清亚洲一区| 乱子伦一区二区| 国产成人精品一区二区三区视频 | 美国一区二区三区在线播放 | 中文字幕中文字幕在线中高清免费版 | 免费高清视频在线一区| 亚洲精品久久久一区二区三区| 日韩精品123区| 麻豆91精品视频| 亚洲春色在线视频| 色综合一本到久久亚洲91| 亚洲激情国产精品| 国产精品7777| 成人久久久精品乱码一区二区三区| 欧美精品一区二区性色a+v| 激情久久一区二区| 色吧影院999| 中文字幕久久网| 国产精品色一区二区三区| www日韩在线观看| 国产精品三级| 国产成人综合精品| 成人在线播放视频| 欧美视频在线一区| 国产农村妇女精品一区| 日韩高清在线观看| 性刺激综合网| 亚洲老司机网| 欧美猛交免费看| 老熟妇高潮一区二区高清视频| 亚洲一区二区五区| 国产视频精品视频| 国产农村妇女精品一区二区| 麻豆亚洲一区| 午夜精品成人av| 在线日韩精品视频| 一起草av在线| 亚洲精品高清在线| 亚洲中文字幕一区| 首页亚洲欧美制服丝腿| 四虎影院一区二区三区 | 亚洲第一国产精品| av大全在线观看| 国产清纯在线一区二区www| 亚洲最大综合网| 亚洲精品电影| 国产日韩在线一区二区三区| 玛雅亚洲电影| 精品国产欧美一区二区五十路| 国产免费高清av| 亚洲一区av在线| 九色porny自拍视频| 老色鬼精品视频在线观看播放| 久久99国产精品一区| 91蝌蚪精品视频| 国产高清视频一区三区| 欧美被日视频| 亚洲精品99久久久久| 国产一区免费看| 亚洲精品高清在线| 久久成人激情视频| 国产精品一区二区91| 一区二区传媒有限公司| 欧美丰满老妇| 精品国产一区二区三区日日嗨| 亚州一区二区三区| 欧美激情国产日韩精品一区18| 欧美美女色图| 6080午夜不卡| 黄色av一级片| 一区二区不卡在线播放| 成人在线一级片| 国产精品18久久久久| 男人的天堂日韩| 激情欧美丁香| 正在播放久久| 欧美女优在线视频| 不卡视频一区| 久久国内精品| 51精品在线观看| 中文在线免费| 一区二区在线视频| 色婷婷av一区二区三| 在线电影国产精品| 五月婷婷六月婷婷| 亚洲福中文字幕伊人影院| 99久久久无码国产精品不卡| 26uuu欧美日本| 午夜福利三级理论电影 | 91美女片黄在线观| 亚洲精品一级二级| 2019精品视频| 欧美精品videossex少妇| 日韩中文字幕视频在线| 青青草免费在线| 亚洲国产精品电影| 午夜免费福利视频| 91麻豆精品91久久久久久清纯 | 欧美精品一区二区三区在线四季| 亚洲国产高清在线观看| 国产色视频一区| 日韩欧美一区二区三区在线观看| 国色天香2019中文字幕在线观看| 国产写真视频在线观看| 深夜福利日韩在线看| 久久天堂电影| 日韩精品免费电影| 天天色天天操天天射| 日韩你懂的在线播放| 国产免费福利视频| 在线电影一区二区三区| 国产精品亚洲lv粉色| 欧美挠脚心视频网站| www.亚洲激情| 欧美又粗又大又爽| 亚洲精品国产精品国自产网站按摩 | 亚洲午夜精品一区二区三区| 精品国内自产拍在线观看视频| 蜜桃臀一区二区三区| 亚洲自拍都市欧美小说| 欧美久久久久久| 奇米狠狠一区二区三区| 欧美日产一区二区三区在线观看| 亚洲国产国产| 日韩经典在线视频| 激情五月色综合国产精品| 日产精品久久久一区二区| 日韩电影免费网址| 伊人久久大香线蕉av一区| 久久久久av| 九一免费在线观看| 欧美日韩久久| 北条麻妃在线视频观看| 午夜亚洲福利在线老司机| 免费av网址在线| 青椒成人免费视频| √天堂资源在线| 国产成a人亚洲精| 给我免费观看片在线电影的| 久久久久久久精| 成人午夜免费影院| 亚洲乱码一区二区三区在线观看| 青青草原免费观看| 精品福利一区二区| 精品久久久久久久久久久国产字幕| 欧洲一区在线电影| 国产精品探花视频| 精品av综合导航| 黄色美女网站在线观看| 日韩中文在线观看| 欧美人与禽猛交乱配| 欧美影院久久久| 亚瑟国产精品| 好看的日韩精品视频在线| 国产精品视频一区二区三区四蜜臂| 中文字幕日韩精品久久| 禁久久精品乱码| www.日本xxxx| 国产91丝袜在线观看| 国产特级黄色录像| 亚洲三级在线看| 女人十八岁毛片| 7777精品伊人久久久大香线蕉最新版| 成人av无码一区二区三区| 国产视频精品自拍| 国产鲁鲁视频在线观看特色| 性欧美激情精品| 国产精久久一区二区| 精品欧美日韩在线| 91精品国产自产拍在线观看蜜| 国产精品久久中文字幕| 久久99国产精品免费网站| av无码一区二区三区| 中文字幕一区二区三区不卡| 1级黄色大片儿| 91精品国产日韩91久久久久久| 免费一级毛片在线观看| 九九精品视频在线| 国产亚洲人成a在线v网站 | 91在线网站视频| 欧美美乳视频| 国产极品在线视频| 国产一区二区毛片| 欧美 日韩 成人| 午夜精品久久久久影视| 国产理论片在线观看| 伊人av综合网| 激情黄产视频在线免费观看| 91在线国产电影| 日韩成人a**站| 日韩av资源在线| 成人h版在线观看| 国产高潮流白浆| 欧美日韩mp4| 国产日韩精品在线看| 91精品国产色综合久久不卡98| 一区二区三区四区高清视频| 一道精品一区二区三区 | 国产第一区电影| 天海翼精品一区二区三区| 成人一级生活片| 国产精品一区免费在线观看| frxxee中国xxx麻豆hd| 91电影在线观看| 黄色免费在线播放| 青青久久av北条麻妃黑人 | 亚洲欧洲日夜超级视频| 久久亚洲视频| 欧美做受xxxxxⅹ性视频| 无吗不卡中文字幕| 丰满岳乱妇国产精品一区| 欧美精品在线播放| 香蕉成人app| 337p亚洲精品色噜噜狠狠p| 国产精品996| 精品97人妻无码中文永久在线| 欧美一区二区三区电影| 成人在线播放免费观看| 91系列在线播放| 欧美精品一区二区三区久久久竹菊| 日本美女久久久| 亚洲精品视频在线看| 亚洲av无码乱码国产麻豆| 欧美大片欧美激情性色a∨久久| 中文一区二区三区四区| 国产v片免费观看| 99精品视频中文字幕| 天堂а√在线中文在线新版| 亚洲美女久久久| 亚洲国产尤物| 手机看片日韩国产| 粉嫩一区二区三区性色av| 亚洲精品午夜久久久久久久| 亚洲韩国日本中文字幕| 成人福利视频| 夜夜爽99久久国产综合精品女不卡 | 亚洲一区二区欧美激情| 日韩一级片免费看| 日本91av在线播放| 日韩欧美视频在线播放| 色婷婷综合在线观看| 亚欧色一区w666天堂| 欧洲毛片在线| 成人免费黄色网| 激情欧美一区| 中文字幕av久久爽一区| 4hu四虎永久在线影院成人| 国模雨婷捆绑高清在线| 久久国产精品精品国产色婷婷| 日韩av电影天堂| 婷婷伊人五月天| 日韩激情视频在线播放| 激情久久一区二区| 日韩a级在线观看| 国产精品美女一区二区| 亚洲a视频在线观看| 欧洲成人在线视频| 91精品久久久久久久蜜月| 日本一级片在线播放| 欧美色男人天堂| 爱情岛亚洲播放路线| 日韩欧美电影一区二区| 国产精品一二三区| 国产情侣小视频| 欧美国产在线电影| 国产亚洲一卡2卡3卡4卡新区| 欧美日韩理论片| 色狠狠av一区二区三区| 性网站在线观看| 日韩午夜视频在线观看| 成熟亚洲日本毛茸茸凸凹| 中文字幕乱码无码人妻系列蜜桃| 97久久精品在线| 日韩精品久久久久久久电影99爱| 国产一卡二卡三卡四卡| 欧美精品一卡两卡|