阅读《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;
}