http://blog.csdn.net/freas_1990/article/details/18718251
Redis的VM机制将会成为历史,不过,回顾一下历史,未尝不是一件乐事。
我们来看一下redis的VM设计。
/* The VM pointerstructure - identifies an object in the swap file.
*
* This object is stored in place of the value
* object in the main key->value hash tablerepresenting a database.
* Note that the first fields (type, storage)are the same as the redisObject
* structure so that vmPointer strucuters canbe accessed even when casted
* as redisObject structures.
*
* This is useful as we don't know if a valueobject is or not on disk, but we
* are always able to read obj->storage tocheck this. For vmPointer
* structures "type" is set toREDIS_VMPOINTER (even if without this field
* is still possible to check the kind ofobject from the value of 'storage').*/
typedef structvmPointer {
unsigned type:4;
unsigned storage:2; /* REDIS_VM_SWAPPED orREDIS_VM_LOADING */
unsigned notused:26;
unsigned int vtype; /* type of the objectstored in the swap file */
off_t page; /* the page at witch the object isstored on disk */
off_tusedpages; /* number of pages used ondisk */
} vmpointer;
vmPointer指向了某一个object在磁盘文件上的存储page起始地址和占用page数。
而这里的文件,就是通过open()调用生成的普通文件,可以用ls -l命令看到完整的属性。
再看一个redis的VM核心filter:
/* Write the specified object atthe specified page of the swap file */ int vmWriteObjectOnSwap(robj *o,off_t page) { if (server.vm_enabled) pthread_mutex_lock(&server.io_swapfile_mutex); if(fseeko(server.vm_fp,page*server.vm_page_size,SEEK_SET) == -1) { if (server.vm_enabled)pthread_mutex_unlock(&server.io_swapfile_mutex); redisLog(REDIS_WARNING, "Critical VM problem invmWriteObjectOnSwap(): can't seek: %s", strerror(errno)); return REDIS_ERR; } rdbSaveObject(server.vm_fp,o); fflush(server.vm_fp); if (server.vm_enabled)pthread_mutex_unlock(&server.io_swapfile_mutex); return REDIS_OK; }
其实,写入到VM file里的方法和RDB的方法是一样的。
Redis采用VM机制是希望把存储做成如同Oracle一样的方式,具备自动淘汰冷热数据功能,但是,它采用了RDB文件和VM机制来分别实现二进制存储、冷热淘汰的功能,确实有些画虎不成反类猫的味道。
对于一个面世不久的server软件而言,冷热数据淘汰机制,很难比Linux操作系统本身更加优秀。
redis之所以高性能最本质的原因是,数据都cache到内存里,或者热数据都cache到内存里。
VM机制试图达到既节约内存又高性能的完美地步,有些吹毛求疵了。
而最新的diskstore试图在这条路上越走越远!
然而,个人认为,这并非一条光明大道!
VM机制在生产中的失败,本质原因是应用的冷热淘汰问题而非server软件本身!传统的数据库行业,对事务要求精确,而对性能稍有容忍。互联网行业刚好相反,对事务几乎没有要求(电子商务、电子支付除外),只要性能好、稳定就行。而性能好归根结底需要把热数据cache到内存。而冷热分离归根结底需要架构师做良好的业务架构!
server软件再强,也敌不过垃圾的业务架构师!
无论是VM还是diskstore,在复杂业务面前,很难让众多的口味得到满足。
而最后的最后,只有业务架构师能把单买好!