檢視記憶體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 圖中右上...