织梦批量修改网站源代码备案网站主办者承诺书
web/
2025/9/30 13:06:49/
文章来源:
织梦批量修改网站源代码,备案网站主办者承诺书,微信小程序怎么做团购,网站备案审核通过时间对象共享
概述
除了用于实现引用计数内存回收机制之外#xff0c;对象的引用计数属性还带有对象共享的作用。
在Redis中#xff0c;让多个键共享同一个值对象需要执行以下两个步骤:
1.将数据库键的值指针指向一个现有的值对象2.将被共享的值对象的引用计数增一
目前来说…对象共享
概述
除了用于实现引用计数内存回收机制之外对象的引用计数属性还带有对象共享的作用。
在Redis中让多个键共享同一个值对象需要执行以下两个步骤:
1.将数据库键的值指针指向一个现有的值对象2.将被共享的值对象的引用计数增一
目前来说Redis在初始化服务器时创建一万个字符串对象这些对象包含了从0到9999的所有整数值当服务器需要用到值为0到9999的字符串对象时服务器就会使用这些共享对象而不是新创建对象
例子
举个例子假设键A创建了一个包含整数值100的字符串对象作为值对象如图所示 如果这时键B也要创建一个同样保存了整数100的字符串对象作为之对象 那么服务器有以下两种做法 1.为键B新创建一个包含整数值100的字符串对象 2.让键A和键B共享同一个字符串 以上两种方法明显是第二种方法更节约内存举个例子,如图所示展示了包含整数值100的字符串对象同时被键A和键B 共享之后的样子可以看到除了对象的引用计数从之前的1变成了2之外其他属性都没有变化共享对象机制对于节约内存非常有帮助数据库中保存的相同的值对象越多对象共享机制就能节约越多的内存 例如假设数据库中保存了整数值100的键不只有键A和键B两个而是有一百个,那么服务器只需要用一个字符串对象的内存就可以保存原本需要使用一百个字符串对象的内存才能保存的数据。举个例子如果创建一个值为100的键A并使用OBJECT REFCOUNT命令查看键A的值对象的引用计数就会发现值对象的引用计数为2
127.0.0.1:6379 SET A 100
OK
127.0.0.1:6379 OBJECT REFCOUNT A
(integer) 2引用这个值对象的两个程序分别时持有这个之对象的服务器程序以及共享这个值对象的键A,如图所示。如果此时再创建一个值为100的键B,那么键B也会指向包含整数值100的共享对象使得共享对象的引用计数值变为3如图所示
127.0.0.1:6379 SET B 100
OK
127.0.0.1:6379 OBJECT REFCOUNT A
(integer) 3
127.0.0.1:6379 OBJECT REFCOUNT B
(integer) 3注意
创建共享字符串对象的数量可以通过修改redis.h/REDIS_SHARED_INTEGERS常量来修改 另外这些共享对象不仅只有字符串键可以使用那些在数据结构中嵌套了字符串对象的对象(linkedlist编码的列表对象、hashtable编码的哈希对象、hastable编码的集合对象以及zset编码的有序集合对象)都可以使用这些共享对象。
为什么Redis不共享包含字符串的对象?
当服务器考虑将一个共享对象设置为键的值对象时程序需要先检查给定的共享对象和键想创建的目标对象是否完全相同只有在共享对象和目标对象完全相同的情况下程序才会将共享对象用作键的值对象而一个共享对象保存的值越复杂验证共享目标和目标对象是否完全相同所需的复杂度就会越高消耗的CPU时间也会越多:
1.如果共享对象是保存整数值的字符串那么一年挣操作的复杂度为O(1)2.如果共享对象是保存字符串值的字符串对象那么验证操作的复杂度为O(N)3.如果共享对象是包含了多个值(或者对象)的对象比如列表对象或者哈希对象那么验证操作的复杂度为O(N^2)因此尽管共享更复杂的对象可以节约更多的内存但受到CPU时间的限制Redis只对包含整数值的字符串对象进行共享
对象的空转时长
概述
redisObject除了type、encoding、ptr和refcount四个属性之外还包含最后一个属性lru属性该属性记录了对象最后一次被命令程序访问的时间
typedef struct redisObject {// ...unsigned lru:22;// ....} robj;OBJECT IDLETIME命令可以打印出给定键的空转市场这一空转时长就是通过将当前时间减去键的之对象的lru时间计算得出的:
例子
举个例子
127.0.0.1:6379 SET msg hello world
OK
// 等待一小段时间
127.0.0.1:6379 OBJECT IDLETIME msg
(integer) 11
// 等待一阵子
127.0.0.1:6379 OBJECT IDLETIME msg
(integer) 16
// 访问msg键的值
127.0.0.1:6379 GET msg
hello world
// 键处于活跃状态空转时长为0
127.0.0.1:6379 OBJECT IDLETIME msg
(integer) 5注意
OBJECT IDLETIME命令的实现比较特殊这个命令在访问键的值对象时不会修改值对象的lru属性 除了可以被OBJECT IDLETIME命令打印出来之外键的空转时长还有另外一项作用:如果服务器打开了maxmemory选项并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时空转时长较高的那部分键会优先被服务器释放从而回收内存。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84469.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!