最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

点破Redis的VM

来源:动视网 责编:小采 时间:2020-11-09 14:09:55
文档

点破Redis的VM

点破Redis的VM:Redis的某一个key的value被swap到文件上的时候,该key的value指向的RedisObject将会改变成VMPointer,VMPointer保存了该value在磁盘文件上的信息,包括起始页面的偏移和连续的页面数等。 typedef struct redisObject { unsig
推荐度:
导读点破Redis的VM:Redis的某一个key的value被swap到文件上的时候,该key的value指向的RedisObject将会改变成VMPointer,VMPointer保存了该value在磁盘文件上的信息,包括起始页面的偏移和连续的页面数等。 typedef struct redisObject { unsig


Redis的某一个key的value被swap到文件上的时候,该key的value指向的RedisObject将会改变成VMPointer,VMPointer保存了该value在磁盘文件上的信息,包括起始页面的偏移和连续的页面数等。 typedef struct redisObject { unsigned type:4; unsigned storage:2;

Redis的某一个key的value被swap到文件上的时候,该key的value指向的RedisObject将会改变成VMPointer,VMPointer保存了该value在磁盘文件上的信息,包括起始页面的偏移和连续的页面数等。

typedef struct redisObject {
 unsigned type:4;
 unsigned storage:2; /* REDIS_VM_MEMORY or REDIS_VM_SWAPPING */
 unsigned encoding:4;
 unsigned lru:22; /* lru time (relative to server.lruclock) */
 int refcount;
 void *ptr;
 /* VM fields are only allocated if VM is active, otherwise the
 * object allocation function will just allocate
 * sizeof(redisObjct) minus sizeof(redisObjectVM), so using
 * Redis without VM active will not have any overhead. */
} robj;


typedef struct vmPointer {
 unsigned type:4;
 unsigned storage:2; /* REDIS_VM_SWAPPED or REDIS_VM_LOADING */
 unsigned notused:26;
 unsigned int vtype; /* type of the object stored in the swap file */
 off_t page; /* the page at witch the object is stored on disk */
 off_t usedpages; /* number of pages used on disk */
} vmpointer;

将该key的value导入内存的逻辑如下:
robj *vmReadObjectFromSwap(off_t page, int type) {
 robj *o;

 if (server.vm_enabled) pthread_mutex_lock(&server.io_swapfile_mutex);
 if (fseeko(server.vm_fp,page*server.vm_page_size,SEEK_SET) == -1) {
 redisLog(REDIS_WARNING,
 "Unrecoverable VM problem in vmReadObjectFromSwap(): can't seek: %s",
 strerror(errno));
 _exit(1);
 }
 o = rdbLoadObject(type,server.vm_fp);
 if (o == NULL) {
 redisLog(REDIS_WARNING, "Unrecoverable VM problem in vmReadObjectFromSwap(): can't load object from swap file: %s", strerror(errno));
 _exit(1);
 }
 if (server.vm_enabled) pthread_mutex_unlock(&server.io_swapfile_mutex);
 return o;
}

到这里,redis VM的精髓已经点破了,懂了吧?

文档

点破Redis的VM

点破Redis的VM:Redis的某一个key的value被swap到文件上的时候,该key的value指向的RedisObject将会改变成VMPointer,VMPointer保存了该value在磁盘文件上的信息,包括起始页面的偏移和连续的页面数等。 typedef struct redisObject { unsig
推荐度:
标签: 某一个 key value
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top