1. 程式人生 > 其它 >記憶體回收與物件共享 - 《Redis設計與實現》讀書筆記

記憶體回收與物件共享 - 《Redis設計與實現》讀書筆記

Redis在物件系統中構架了一個引用計數計數實現了記憶體回收機制物件共享機制

基於引用計數技術的 記憶體回收機制

程式通過跟蹤物件的引用計數資訊,在適當的時候自動釋放物件並進行記憶體回收

基於引用計數技術的 物件共享機制

共享物件機制對於節約記憶體非常有幫助,資料庫中儲存的相同值物件越多,物件共享就越能節約越多的記憶體,

Redis在初始化伺服器時,會建立一萬個字串物件,這些物件包含了從0到9999的所有整數值,當伺服器需要用到值為0到9999的字串物件時,伺服器就會使用這些共享物件,而不是新建立物件,
在資料結構嵌套了字串物件的物件都可以使用這些共享物件
由於檢查物件是否相等而造成的CPU時間限制,Redis只對包含整數值的字串物件

進行共享,建立共享字串物件的數量可以通過修改src/server.h/OBJ_SHARED_INTEGERS常量進行調整

實現原理

每個物件的引用計數資訊由redisObject結構的refcount屬性記錄:

typedef struct redisObject {
    // ...

    // 引用計數
    int refcount;

    // ...
} robj;

物件的引用計數資訊會隨著物件的使用狀態而不斷變化

  • 在建立一個新物件時,引用計數的值會被初始化為 1
  • 當物件被一個新程式使用時,呼叫incrRefCount,引用計數的值會被 +1
  • 當物件不再被程式使用時,呼叫decrRefCount,引用計數的值會被 -1
  • 當物件的引用計數值變為0時,物件所佔用的記憶體會被釋放

原始碼閱讀

  1. 檔案:src/object.c
隻言片語任我說,提筆句句無需忖。落筆不知寄何人,唯有邀友共斟酌。