Redis学习笔记 - 内存回收、对象共享、对象的空转时长
参考:<<Redis设计与实现>>
- 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异
一、内存回收
C语言不具备自动内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数(reference counting)计数实现的内存回收机制。
通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当时候自动释放对象并进行内存回收。
每个对象的引用计数信息由redisObject结构的refcount属性记录:
typedef struct redisObject {// ...// 引用计数int refCount;// ...
} robj;
对象的引用计数信息会随着对象的使用状态而不断变化:
- 在创建一个新对象时,引用计数的值会被初始化为1
- 当对象被一个新程序使用时,它的引用计数值会被+1
- 当对象不再被一个程序使用时,它的引用计数值会被-1
- 当对象的引用计数值变为0时,对象所占的内存会被释放
对象的整个生命周期可以划分为:创建对象、操作对象、释放对象三个阶段。
示例:
展示一个字符串对象从创建到释放的整个过程:
// 创建一个字符串对象s,对象的引用计数为1
robj *s = createStringObject(...);// 对象s执行各种操作...// 将对象s的引用计数-1,使得对象的引用计数变为0,导致对象被释放
defrRefCount(s);
其他不同类型的对象声明周期也类似。
二、对象共享
对象的引用计数属性除了用于计数内存回收机制外,还带有对象共享的作用。
在Redis中,多个键共享同一个值对象需要以下两个步骤:
- 将数据库键的值指针指向一个现有的值对象
- 将被共享的值对象的引用计数+1
示例:
键A、B都创建了一个包含整数值100的字符串对象作为值对象,此时这个值对象将会被A、B共享,对象的引用计数就会变成2,其他属性没有变化。参考下图说明:
目前来说,Redis在初始化服务器时,创建一万个字符串对象,这些对象包含了从0-9999的所有整数值,当服务器需要用到值为0-9999的所有整数值时,Redis就会使用这些共享对象,而不创建新对象。
示例:
创建一个值为100的键A,使用object refcount 命令查看键A的值对象引用计数为2;再创建一个置为100的键B,此时引用计数为3。
引用这个值对象的分别为:持有这个值对象的服务器程序、键A和B。
注:使用redis4.0测试了一下,对于0-9999,object refcount
命令都返回 2147483647,对于10000,就返回1
redis> set A 100
OK
redis> object refcount A
(integer) 2
redis> set B 100
OK
redis> object refcount A
(integer) 3
redis> object refcount B
(integer) 3
共享值对象的说明如下图:
注:共享对象不仅是字符串使用,其他对象的数据结构中有嵌套了字符串对象都可以使用这些共享对象。
三、对象的空转时长
redisObject还包含一个lru
属性,该属性记录了对象最后一次被命令程序访问的时间:
typedef struct redisObject {// ...unsigned lru:22;// ...
} robj;
object idletime
命令可以打印给定键的空转时长,这个值是通过 当前时间 - 值对象的lru时间
得出的。
示例:
redis> set str test
OK# 等待一段时间
redis> object idletime str
(integer) 5# 访问str
redis> get str
"test"# 键活跃,空转时间清0
redis> object idletime str
(integer) 0
注:object idletime命令可以打印空转时间,还有一个作用:
- 如果服务器打开了maxmemory选项,并且服务器回收内存的算法为 volatile-lru 或者 allkeys-lru,此时当服务器占用的内存数超过了 maxmemory 选项所设置的上限值,空转时间较长的那部分键会优先被服务器释放,从而回收内存。
Redis学习笔记 - 内存回收、对象共享、对象的空转时长相关推荐
- Redis对象的refcount与lru属性(内存回收、对象共享、空转时长)
本笔记参考<Redis设计与实现> P84~P88 内存回收 Redis在对象系统中使用reference counting技术实现了内存回收机制.程序可以通过跟踪对象的引用计数信息,在适 ...
- 学习笔记之——Python中类和对象的理解
学习笔记之--Python中类和对象的理解 面向对象的含义和特性 类 Python中类的定义.结构.创建 Python类的定义 Python类的结构 类的创建 类的属性 类的方法 对象 对象的创建 参 ...
- 软件调试学习笔记(一)—— 调试对象
软件调试学习笔记(一)-- 调试对象 准备工作 调试器与被调试程序 DebugActiveProcess 连接调试器 分析kernel32!DebugActiveProcess 分析ntdll!Dbg ...
- JavaScript学习笔记05【高级——DOM对象】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- CodeMonkey过关学习笔记系列:11-20关 对象
CodeMonkey过关学习笔记系列:11-20关 •对象和朋友(OBJECTS AND FRIENDS) 11~20 知识点 turnTo,turtle.step 做题之前,解决事情之前我们先列好计 ...
- Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法
Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...
- Matlab_GUI学习笔记(五)——常用对象的属性之Line
Matlab_GUI学习笔记(五)--常用对象的属性之Line 1. Line 很多属性与之前的Figure与Axes属性差别不大,重点在于Line的核心属性Data. >> get(li ...
- redis笔记-对象的空转时长
1. redisObject的lru属性记录了该对象最后一次被命令访问的时间 2. object idletime可以打印给定键的空转时长, 通过当前时间减去键的值对象的lru时间 3. object ...
- Redis学习笔记②实战篇_黑马点评项目
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...
最新文章
- linux项目课程设计,LINUX课程设计项目需求解析.doc
- SQL Server误区30日谈-Day21-数据损坏可以通过重启SQL Server来修复
- Python全栈开发:RabbitMQ/Redis/Memcache/SQLAlchemy
- Python 技术篇-mac下安装、卸载pip方法
- html网页语言是什么,HTML是什么?
- 堆排序 C++代码实现及思想 排序过程输出 恋上数据结构笔记
- 爱优腾芒“跑马圈地”,AI广告营销能拯救“盈利难”的视频平台吗?
- 【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下
- nginx缓存HtmL文件,Nginx在缓存的html文件上返回404
- python生成1到100的列表_python列表生成式与列表生成器的使用
- html网页商品销量滞后怎么做,iview 刷新滞后于html问题
- IDA Pro、OllyDbg、LordPE和UltraEdit简单实用实验
- 开始学习英语的七个步骤。
- 电话线配线架是110配线架吗?电话线配线架的接法详细介绍
- 关于文件内搜索的软件
- 马克思主义基本原理笔记(黄色标记要求会背)
- PHP 八羊闪电本地相册图片查看器V1 PHP极简代码直接查看本地文件夹图片 源码下载!
- CPU100%,怎么快速定位?
- clannad手游汉化版_clannad游戏中文版
- MindSpore:环境问题案例