redis記憶體模型

2021-09-23 08:00:06 字數 1742 閱讀 1069

檢視記憶體info memory

# redis分配器分配的記憶體總量(位元組)

used_memory:24989816

# redis分配器分配的記憶體總量

used_memory_human:23.83m

# redis程序佔據作業系統的記憶體(位元組)

used_memory_rss:36409344

used_memory_peak:66819000

used_memory_peak_human:63.72m

used_memory_lua:41984

# 記憶體碎片比率,該值是used_memory_rss/ used_memory的比值

# 一般大於1,且該值越大,記憶體碎片比例越大

# 小於1,說明redis使用了虛擬記憶體,由於虛擬記憶體的媒介是磁碟,比記憶體速度要慢很多

mem_fragmentation_ratio:1.46

# redis使用的記憶體分配器

mem_allocator:jemalloc-3.6.0

used_memory部分儲存的是資料緩衝記憶體redis在編譯時便會指定記憶體分配器;記憶體分配器可以是libc 、jemalloc、tcmalloc,預設是jemalloc。

jemalloc在64位系統中,將記憶體空間劃分為小、大、巨大三個範圍;每個範圍內又劃分了許多小的記憶體塊單位;當redis儲存資料時,會選擇大小最合適的記憶體塊進行儲存。

jemalloc劃分的記憶體單元如下圖所示:

執行set hello world時,所涉及到的資料模型

dictentry:redis是key-value資料庫,因此對每個鍵值對都會有乙個dictentry,裡面儲存了指向key和value的指標;next指向下乙個dictentry,與本key-value無關。

key:圖中右上角可見,key(」hello」)並不是直接以字串儲存,而是儲存在sds結構中。

value:既不是直接以字串儲存,也不是像key一樣直接儲存在sds中,而是儲存在redisobject中。redisobject中的type欄位指明了value物件的型別,ptr欄位則指向物件所在的位址

redisobject的定義如下(不同版本的redis可能稍稍有所不同):

typedef struct redisobject 

robj;

sds結構 sds的結構如下:

struct sdshdr 

;

buf陣列的長度=free+len+1(其中1表示字串結尾的空字元』\0』);

乙個sds結構佔據的空間為:free所佔長度+len所佔長度+ buf陣列的長度=4+4+free+len+1=free+len+9。

ps: 如果key的長度如果是8個位元組,則sds為17位元組,jemalloc分配32位元組;此時將key長度縮減為7個位元組,則sds為16位元組,jemalloc分配16位元組;

Redis記憶體模型

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

Redis記憶體模型

3.4.1 refcount與共享物件 緩衝區溢位 使用c字串的api時,如果字串長度增加 如strcat操作 而忘記重新分配記憶體,很容易造成緩衝區的溢位 而sds由於記錄了長度,相應的api在可能造成緩衝區溢位時會自動重新分配記憶體,杜絕了緩衝區溢位。修改字串時記憶體的重分配 對於c字串,如果要...

Redis記憶體模型 2 儲存細節

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