redis原始碼學習筆記

2021-08-22 04:33:57 字數 1912 閱讀 2955

目錄

1:從資料結構開始(圖為原始碼,附帶個人簡單分析):

a:動態字串         檔案: sds.h sds.c

前言:s-(sizeof(struct sdshdr))的解釋為buf為柔性陣列,不占用空間,僅僅為偏移量,所以s指標向後退乙個結構體大小為結構體位址所在。

分析:這個結構是整個動態字串的基礎,sds為 sdshdr的buf指標,根據buf找到結構體的位址,操作成員len。

分析:依據init 生成乙個新的動態字串

const void *init 為初始化字串指標, initlen為字串大小

如果init為空則初始化開闢的initlen大小buf的初始化為0的記憶體。

不空則拷貝init至buf,返回buf位址

改變buf記憶體大小,擴增

如果擴增的addlen+len大於1024*1024則新長度為1024*1024

realloc修改記憶體大小

返回buf位址

釋放free空間,將動態陣列總長度設定為len+1,free為0;

在free空間中劃出inc大小的空間,放到len空間中;

此函式為設定動態字元陣列->len大小設定為引數len,先從free空間補,若是不夠,則重新分配陣列大小。

動態字串追加函式,t為追加的字串,len為追加字串的長度。擴充套件s的len,memcpy;

字串拷貝函式,依然先判斷free大小是否足夠。不夠則重新分配大小。

在學習此函式之前先了解一下基礎知識;

vsnprintf函式

標頭檔案:#include  

函式原型:int vsnprintf(char *str, size_t size, const char *format, va_list ap);

函式說明:將可變引數格式化輸出到乙個字元陣列

引數:str輸出到的陣列,size指定大小,防止越界,format格式化引數,ap可變引數列表

此函式是將格式化輸入當做是動態字串的字元指標指向的值(追加值);

這個函式我的理解是,把s中的字元cset集合從兩頭剔除,中間部分可能不被刪除。

strchr為找到引數1中第一次出現引數2的位置。

用sp記錄cset首部字元個數,ep記錄cset尾部字元個數,ep-sp為裁剪之後的字串長度,

memove裁剪後的內容。

Redis原始碼學習筆記(一)

最近在用redis,一直沒有時間去了解redis原理以及內部實現,準備花乙個月的閒暇時間去看看redis低版本的原始碼,學習一下redis的原理以及內部實現。要想看到redis的執行效果,第一步執行.redis server 第二步重新開啟乙個視窗,執行.redis cli set mykey so...

《Redis原始碼學習筆記》事務

url 原始碼學習筆記 文章列表 url redis中的事務,提供了一種 b 將多個命令打包並且一次執行 b 的方式 當使用者輸入multi命令時,就開啟了客戶端redis multi選項,客戶端從 非事務狀態 切換到 事務狀態 img 之後客戶端執行的所有命令都不會被redis立即執行,而是放到客...

redis原始碼閱讀筆記

在redis中乙個資料庫結構體是這樣的 每個dict是乙個hash表 typedef struct redisdb redisdb dict欄位中存放以key值為鍵,以value指標為值的hash表項dict根據型別的不同分為如下幾種 1 字串 string 操作 set key value get...