Redis記憶體模型

2021-08-21 10:17:27 字數 1224 閱讀 5603

3.4.1)refcount與共享物件

緩衝區溢位:使用c字串的api時,如果字串長度增加(如strcat操作)而忘記重新分配記憶體,很容易造成緩衝區的溢位;而sds由於記錄了長度,相應的api在可能造成緩衝區溢位時會自動重新分配記憶體,杜絕了緩衝區溢位。

修改字串時記憶體的重分配:對於c字串,如果要修改字串,必須要重新分配記憶體(先釋放再申請),因為如果沒有重新分配,字串長度增大時會造成記憶體緩衝區溢位,字串長度減小時會造成記憶體洩露。而對於sds,由於可以記錄len和free,因此解除了字串長度和空間陣列長度之間的關聯,可以在此基礎上進行優化:空間預分配策略(即分配記憶體時比實際需要的多)使得字串長度增大時重新分配記憶體的概率大大減小;惰性空間釋放策略使得字串長度減小時重新分配記憶體的概率大大減小。

訪問二進位制資料:sds可以,c字串不可以。因為c字串以空字元作為字串結束的標識,而對於一些二進位制檔案(如等),內容可能包括空字串,因此c字串無法正確訪問;而sds以字串長度len來作為字串結束標識,因此沒有這個問題。

embstr:<=39位元組的字串。embstr與raw都使用redisobject和sds儲存資料,區別在於,embstr的使用只分配一次記憶體空間(因此redisobject和sds是連續的),而raw需要分配兩次記憶體空間(分別為redisobject和sds分配空間)。因此與raw相比,embstr的好處在於建立時少分配一次空間,刪除時少釋放一次空間,以及物件的所有資料連在一起,尋找方便。而embstr的壞處也很明顯,如果字串的長度增加需要重新分配記憶體時,整個redisobject和sds都需要重新分配空間,因此redis中的embstr實現為唯讀。

raw:大於39個位元組的字串

val:鍵值對中的值,使用union(即共用體)實現,儲存的內容既可能是乙個指向值的指標,也可能是64位整型,或無符號64位整型;

size屬性記錄了雜湊表的大小,即bucket的大小;

used記錄了已使用的dictentry的數量;

sizemask屬性的值總是為size-1,這個屬性和雜湊值一起決定乙個鍵在table中儲存的位置。

乙個key,7位元組,所以sds(key)需要7+9=16個位元組,jemalloc會分配16位元組的記憶體塊;

乙個redisobject,16位元組,jemalloc會分配16位元組的記憶體塊;

乙個value,7位元組,所以sds(value)需要7+9=16個位元組,jemalloc會分配16位元組的記憶體塊;

綜上,乙個dictentry需要32+16+16+16=80個位元組;

Redis記憶體模型

五 理解記憶體 1.記憶體消耗 1 物件記憶體 redis所有資料均採用keyvalue資料型別,每次建立鍵值對時,至少建立兩個型別物件 key物件和value物件,物件記憶體 sizeof keys sizeof values key物件均為字串,value物件包括 string hash lis...

redis記憶體模型

檢視記憶體info memory redis分配器分配的記憶體總量 位元組 used memory 24989816 redis分配器分配的記憶體總量 used memory human 23.83m redis程序佔據作業系統的記憶體 位元組 used memory rss 36409344 us...

Redis記憶體模型 2 儲存細節

先看一下執行set hellow world時,所涉及的資料模型 1 dictentry redis是key value資料庫,因此對每個鍵值對都會有乙個dictentry,裡面儲存了指向key和value的指標 next指向下乙個dictentry,與本key value無關。2 key 圖中右上...