redis基礎資料結構(二) 記憶體管理模組

2021-08-20 17:12:12 字數 1162 閱讀 6059

redis可選記憶體管理方式為tcmalloc或jemalloc,用巨集控制,一般用jemalloc效能最好,底層呼叫remalloc介面,redis的記憶體管理模組只是封裝函式,記憶體管理在zmalloc.h和zmalloc.c中。

zmalloc.c中定義乙個全域性變數used_memory和兩個用於管理user_memory的巨集,如下

#define update_zmalloc_stat_alloc(__n) do  while(0)

#define update_zmalloc_stat_free(__n) do while(0)

static size_t used_memory = 0;

pthread_mutex_t used_memory_mutex = pthread_mutex_initializer;

其中atomicincr和atomicdecr是原子操作,通過互斥鎖實現,記憶體補齊使用位操作以保證效能,used_memory儲存的是實際使用的記憶體大小

記憶體分配函式zmalloc:

void *zmalloc(size_t size)
給ptr分配記憶體時,增加size_t大小記憶體,用於儲存實際使用的記憶體大小,返回給呼叫者的指標越過這個大小的位址。其餘記憶體管理函式calloc和realloc等實現方式和malloc類似

程序記憶體管理:

size_t zmalloc_get_rss(void) 

close(fd);

p = buf;

count = 23; /* rss is the 24th field in /proc//stat */

while(p && count--)

if (!p) return 0;

x = strchr(p,' ');

if (!x) return 0;

*x = '\0';

rss = strtoll(p,null,10);

rss *= page;

return rss;

}

通過讀取/proc/pid/stat中的rss欄位,涉及檔案讀取,顯然效能很差。記憶體碎片率用rss/used_memory計算,此外zmalloc模組還提供了讀取smap等記憶體介面,具體含義參見linux程序記憶體管理機制

Redis 基礎資料結構

基礎資料型別 5種 string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 set key name value 命令用於設定給定key的值,如果key已經儲存其它值,則會覆蓋舊值,且與型別無關 get key name 命令用於獲取指定key的值,如果key不存在,則...

Redis 基礎資料結構

redis有5種基礎資料結構,分別是 string list hash set zset。1 string 字串 字串string是redis最簡單的資料結構,內部表示的就是乙個字元陣列。儲存值 set key value 獲取值 get key redis可以對多個字串進行批量讀寫。批量儲存 ms...

Redis資料結構(二)

1 壓縮列表是為了節省記憶體而設計的,是一種線性的資料結構。主要用在雜湊和列表兩種資料型別中。2 壓縮列表包含主要包含五個部分,這五個部分順序排列組合在一起。結構如下圖所示。表節點,有三個域組成。previous entry length,用來記錄前乙個節點的長度。encoding,記錄下乙個域的資...