目錄
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...