閱讀《redis設計與實作》時候,書中提到redis為了節省記憶體會在初始化服務器時,創建一萬個字串物件,這些物件包含了1到9999的所有整數值,當服務器需要用到值為0到9999的字串物件時,服務器就會使用這些共享物件,而不是創建新的物件,
書中提到如果創建一個值為100的鍵A,并使用OBJECT REFCOUNT命令查看A的 參考計數:
redis> SET A 100
OK
redis> OBJECT REFCOUNT A
(integer) 2
但是當在本機實操時候得到結果圖如下:

查看原始碼,發現新版本的redis中OBJ_SHARED_INTEGERS變數定義了共享整數10000,并且定義不被銷毀的全域物件的參考數量OBJ_SHARED_REFCOUNT為INT_MAX,INT_MAX = 2^31 - 1 =2147483647,


并且原始碼中可以看到當把一個物件設定為共享時候就會把refcount設定為INT_MAX
robj *makeObjectShared(robj *o) {
serverAssert(o->refcount == 1);
o->refcount = OBJ_SHARED_REFCOUNT;
//使得物件為共享,設定為obj_shared_refcount 其大小為int_max
return o;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/226269.html
標籤:其他
