redis OBJECT REFCOUNT 0-9999 会显示 (integer) 2147483647

本文探讨Redis中的共享整数机制,介绍服务器如何通过预创建1到9999的整数值来节省内存。同时,文章解释了新版本Redis中如何将对象设置为共享并将其引用计数设置为INT_MAX。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅读《redis设计与实现》时候,书中提到redis为了节省内存会在初始化服务器时,创建一万个字符串对象,这些对象包含了1到9999的所有整数值,当服务器需要用到值为0到9999的字符串对象时,服务器就会使用这些共享对象,而不是创建新的对象。
书中提到如果创建一个值为100的键A,并使用OBJECT REFCOUNT命令查看A的 引用计数:

redis> SET A 100
OK
redis> OBJECT REFCOUNT A
(integer) 2

但是当在本机实操时候得到结果图如下:
image.png
查看源码,发现新版本的redis中OBJ_SHARED_INTEGERS变量定义了共享整数10000,并且定义不被销毁的全局对象的引用数量OBJ_SHARED_REFCOUNT为INT_MAX,INT_MAX = 2^31 - 1 =2147483647。
image.png

image.png
并且源码中可以看到当把一个对象设置为共享时候就会把refcount设置为INT_MAX

robj *makeObjectShared(robj *o) {  
    serverAssert(o->refcount == 1);  
    o->refcount = OBJ_SHARED_REFCOUNT;  
    //使得对象为共享,设置为obj_shared_refcount 其大小为int_max  
    return o;  
}  

image.png

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值