手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Redis深入之内存回收和对象共享

[日期:2014-12-19] 来源:Linux社区  作者:Linux [字体: ]

内存回收

C语言并不具备自动内存回收功能,Redis在自己的对象系统中构建了一个引用计数技术实现的内存回收机制,通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。每个对象的引用计数信息由redis对象结构的refcount属性记录,创建一个新对象时,引用计数值会初始化为1;对象被一个新程序使用时,它的引用计数值会被增1;不再被一个程序使用时,减1;引用计数值变为0,对象所占用的内存会被释放。

对象共享

对象的引用计数属性还带有对象共享的作用。Redis会共享值为0到9999的字符串对象。如果键A创建了一个包含整数值100的字符串对象作为值对象,键B也要创建一个同样保存了整数值100的字符串对象作为值对象,服务器可以让键A和键B共享同一个字符串对象,Redis中需要两步,1)将数据库键的值指针指向一个现有的值对象;2)将被共享的值对象的引用计数增一。共享对象机制对于节约内存非常有帮助,数据库中保存的相同值对象越多,对象共享机制就能节约越多的内存。

问:Redis为什么只对包含整数值得字符串对象进行共享?

当服务器考虑将一个共享对象设置为键的值对象时,程序需要先检查给定的共享对象和键想创建的目标对象是否完全相同。一个共享对象保存的值越复杂,验证共享对象和目标对象是否相同所需的复杂度就会越高,消耗的CPU时间也会越多。

如果共享对象是保存整数值的字符串对象,验证操作的复杂度O(1)

如果共享对象是保存字符串值的字符串对象,验证操作的复杂度O(N)

如果共享对象是包含多个值(比如列表对象或者哈希对象)对象,验证操作的复杂度O(N2)

故尽管共享更复杂的对象可以节约更多的内存,但受到CPU时间的限制,Redis只对包含整数值得字符串对象进行共享。

 

Ubuntu 14.04下Redis安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10下安装Redis(图文详解)+ Jedis连接Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis系列-安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3安装Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis安装部署学习笔记 http://www.linuxidc.com/Linux/2014-07/104306.htm

Redis配置文件redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

Redis 的详细介绍请点这里
Redis 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-12/110657.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款