就像前面提到的那样,redis目前就像是CISC cpu, 有一个功能就加一个指令,这个
颇有点头疼医头,脚疼医脚,既然谈到CISC,那么不得不提到RISC,RISC对于CISC的改进
可以看得到的就是简化指令,这个大家可以参考下intel的x86指令集砖头书与mips的
mips32指令集的示意图,两者的差别应该是很明显的,如我先前所提到的那样,INCRBY
与HINCRBY 完全可以设计成一个指令,只是得配合另外一个定位功能,所以就像RISC虽然
精简了指令集数目,但往往实现同样一个功能会增加几个指令一样,我之前自己设计的
PLUS指令可能就会相对INCRBY和HINCRBY要多出一些判断数据类型以及多重定位的处理步
骤,这一点就我个人来说,是可以接受的。
另外的问题是策略不够灵活,我之前说过你完全可以自己定制类型实现,但如果是
嵌套的类型就比较难办,你得能够调用其他人写的实现,如果你不了解内在的实现,就c
语言来说就无法动态的调用相应的实现,也许函数指针是可以的,但你得定个调用规范,
类似FFI那样麻烦,这种情况下,不如使用分离式的设计,既将redis server分离为虚拟
机与存储器实现两个部分,虚拟机指令集应该由官方控制,但是预留客户定制的指令空间
至于存储器实现那就可以官方只实现经典的那些,而客户可以自行根据自己的策略实现某
种符合官方定义的数据类型,例如带SSD备份的hash类型,而list仍然只用在内存里的方
式,掉电不管。
这里的好处在于,通过分离式的设计,达到了策略上的完全灵活,一个命令,你既可
以带检查,也可以直接映射某个存储类型提供的操作,这一切取决于你的程序,相比较
redis2.6提供的lua方案,这个虚拟机的开销要远比起个lua其语言的开销小多了。另外
这个方案的好处还在于提供升级与降级的简易方案,写过虚拟机的朋友都晓得,移植cpu
远比移植一个完整应用容易,因为cpu就那几个指令,像我的tweezervm那更是精简得吓人
因为是堆栈式的,只有30来个指令,c/py的版本都能轻松实现,当然,其实你也可以用
fpga烧录一个专用的cpu,这个相比你的汇编实现的redis还给力哦。何况,必要时候你可
以轻松切换到jvm上去 :] 考虑到最近facebook正在往jvm上迁,企业用户应该更喜欢这
个方案吧。
ADT就是抽象数据类型的意思,学过c的应该有所了解,我虽然半路出家,恰好也在
云风那学到了这口黑话。ADT的好处在于你可以依据策略来调整实现,但行为的效果却是
对外一致的。这种方式,当然是很适合虚拟机这种设计的,因为你如果用c的宏 那只是在
编译时候就确定的了,在你运行时就糟糕了。另外核心的逻辑代码能够大大的精简,我看
c代码有大量的宏判断,为相关的调用做数据准备之类的冗余,核心逻辑往往就隐藏在这
一堆里,十分影响后来的人理解系统