Redis:引用计数算法
由于Redis是使用ANSI C语言编写的,C语言本身并没有具备自动的内存回收机制,因此Redis自己做了一套针对对象的内存回收系统----通过使用 引用计数(reference counting) 来使程序在正确的时机自动释放对象并进行内存回收。
在redisObject中拥有一条名为“refcount”的属性,其作用便是用来记录对象的使用情况:
typedef struct redisObject {
//...
//引用计数
int refcount;
//...
}robj;
引用计数在程序中发生的变化
在程序使用对象的时候,该属性是如何变化的呢?
在《redis设计与实现》一书中为我们讲述了该属性的变化机制:
·在创建一个新对象时,引用计数的值会被初始化为1;
·当对象被一个新程序使用时,它的引用计数值会被增一;
·当对象不再被一个程序使用时,它的引用计数值会被减一;
·当对象的引用计数值变为0时,对象所占用的内存会被释放。
对于redis而言,对象的生命周期可以划分为:创建对象,操作对象,释放对象 三个阶段:
在创建对象时,将计数器默认初始化为1:
robj *createObject(int type, void *ptr) {
robj *o = zmalloc(sizeof(*o));
o->type = type;
o->encoding