http://www.yn57.com/jiqiao/17141.html
当一个value交换到磁盘时,value对应的RedisObject将被替换成VMPointer,VMPointer保存value在磁盘的信息,RedisObject和VMPointer的定义如下:
/*RedisObject定义*/
typedefstructredisObject{
unsignedtype:4;
unsignedstorage:2;/*REDIS_VM_MEMORYorREDIS_VM_SWAPPING*/
unsignedencoding:4;
unsignedlru:22;
intrefcount;
void*ptr;
}robj;
/*VMPointer定义*/
typedefstructvmPointer{
unsignedtype:4;
unsignedstorage:2;/*REDIS_VM_SWAPPEDorREDIS_VM_LOADING*/
unsignednotused:26;
unsignedintvtype;/*typeoftheobjectstoredintheswapfile*/
off_tpage;/*thepageatwitchtheobjectisstoredondisk*/
off_tusedpages;/*numberofpagesusedondisk*/
}vmpointer;
从上面代码可以看出,RedisObject和VMPointer都有一个storage字段,用于标识value存储位置,这个字段可能的值有:
REDIS_VM_MEMORY:该key所关联的value存储在内存里。
REDIS_VM_SWAPPED:value已经被交换到磁盘,Hash表中的value值已被设置为NULL。
REDIS_VM_LOADING:value已经被交换至磁盘,但是现在有一个任务正在把它从磁盘中加载到内存(这个值只在threadedVM开启的时候用到)。
REDIS_VM_SWAPPING:value在内存中,但是有一个任务正在把它从内存中写入磁盘。
所以,当value存储在内存中时,Redis使用一个RedisObject与之关联;而当value存储在磁盘中时,Redis使用一个VMPointer与之关联。要知道value存储在磁盘中还是内存中,只需判断storage字段。
VMPointer中主要记录value在磁盘中的信息。
vtype字段:设置成交换出去的对象类型。
page字段:记录对象在SWAP文件中从哪页开始。
usedpages字段:记录对象共包含几页。