redis原始碼之dict

2021-10-24 19:03:02 字數 2423 閱讀 1085

大家都知道redis預設是16個db,但是這些db底層的設計結構是什麼樣的呢? 我們來簡單的看一下原始碼,重要的字段都有所注釋

typedef struct redisdb  redisdb;
redis中的所有kv都是存放在dict中的,dict型別在redis中非常重要。

字典disc的資料結構如下

typedef struct dict  dict;
redis中當出現hash衝突的時候,我們會採用頭插法(鍊錶)的方式來解決,但是鍊錶無限增常的話hashtable會退化,退化成乙個鍊錶,影響查詢效率,這個時候我們就需要對之前的陣列進行擴容,把老的資料搬到新陣列上面,這個過程就是rehash

接下來咱們來看看dicttype的型別

typedef struct dicttype  dicttype;
typedef struct dictht  dictht;
typedef struct   v;

struct dictentry *next; //頭插法解決hash衝突

} dictentry;

接下來我們看一下記憶體關係的對應圖

typedef struct redisobject  robj;
最後咱們有一張總的圖來表是redis的記憶體關係

encoding儲存的優化策略 #####1:整型編碼的處理 我們先來看乙個例子

127.0.0.1:6379> set type-int 12345

ok127.0.0.1:6379> object encoding type-int

"int"

//返回的encoding型別是int

127.0.0.1:6379> set type-int-long 12345678901234567890

ok127.0.0.1:6379> object encoding type-int-long

"embstr"

//返回的encoding型別是embstr

我們可以發現,在都是數字的時候,如果長度小於20,就會自動轉換為int型別,這是redis中專門做的處理

if (len <= 20 && string2l(s, len, &value))
在乙個redisobject中,就可以直接用ptr去儲存整型值,而不用重新去開闢一塊sds的空間

#####2:redis物件字串儲存相關優化

127.0.0.1:6379> set type-str-short ***

ok127.0.0.1:6379> object encoding type-str-short

"embstr"

127.0.0.1:6379> set type-str-long *********x-*********x-*********x-*********x-x

//字串長度45

127.0.0.1:6379> object encoding type-str-long

"raw"

127.0.0.1:6379> set type-str-long2 *********x-*********x-*********x-*********x-

//字串長度44

127.0.0.1:6379> object encoding type-str-long2

"embstr"

乙個redisobject是存在記憶體中的,cpu在完成乙個io的時候,它是怎麼來讀資料的呢,其實cup的io中有乙個緩衝行的概念,在linux系統中,乙個緩衝行一般是64個位元組 接下來我們看看乙個redis物件大概占多大的記憶體空間,其實我們可以大概算出來。

typedef struct redisobject  robj;
乙個redis物件本身就需要佔 (4bit+4bit+24bit = 4byte) + 4byte + 8byte = 16byte的大小

這樣的話乙個緩衝行還剩餘48個byte的大小,有點浪費, 48個byte,按照sds的分配策略應該在sdshdr8那個區間中,而sdshdr8本身就需要佔3個位元組,sds需要相容c語言的函式庫,都會在結尾加上\0,所以sdshdr8本身是占用4個位元組,所以乙個緩衝行中還剩餘44個位元組,來儲存剩餘的資料,所以在redis字串物件中,當長度小於44的時候,encoding的型別是embstr,沒有新開闢一塊sds空間

redis原始碼剖析 dict

typedef struct dictentry v struct dictentry next dictentry typedef struct dicttype dicttype this is our hash table structure.every dictionary has two ...

Redis原始碼 dict資料結構(實現)

本文分析的是src dict.c檔案。從結構上來說,可以分為 1.私有函式 以下劃線開頭的一般都是,一般都是一些輔助函式 2.公開api。從功能來說,可以分為 1.dict初始化 析構 2.元素操作 查詢 刪除 插入 替換 修改值 清空資料 3.遍歷dict,迭代器相關 比如需要持久化雜湊表的資料時...

Redis原始碼分析(三) dict雜湊結構

昨天分析完adlist的redis 今天馬上馬不停蹄的繼續學習redis 中的雜湊部分的結構學習,不過在這裡他不叫什麼hashmap,而是叫dict,而且是一種全新設計的一種雜湊結構,他只是通過幾個簡單的結構體,再搭配上一些比較常見的雜湊演算法,就實現了類似高階語言中hashmap的作用了。也讓我見...