阿里巴巴集团内部有一套k-v存储中间件(阿里云上有),叫Tair,底层包含了mdb,rdb,ldb三种存储引擎,分别对应了memcached,redis和leveldb。通常对于缓存的需求,我一般会使用mdb或者rdb;而对于k-v持久化的存储,会使用ldb。对上述的一般性认识会是mdb,rdb是内存数据库,数据可能会丢,ldb是持久化数据库,数据不会丢。这样的理解个人认为并没有错,或许会有质疑,redis有持久化的能力,但我还是觉得redis的持久化能力是为了避免数据大量丢失而进行高成本的重建。其本质还是内存数据库,即使有虚拟内存技术提高了内存的上限,当内存不够用时,还是会依据LUR等策略丢弃不新鲜的数据。
memcached和redis之间或许有得一比较。作为同样是内存数据库,其本质是相同的,但是在实现功能上或许有些差异。
- 首先redis有持久化能力,memcached没有
- redis有副本的能力,memcached没有
- redis支持更多的数据结构,其命令提供了更加丰富的原生语意
所以从上面这些来看,redis确实从一定程度上比memcached更加现代一点。这个回到基本上也在说redis可以替代memcached.Memcached真的过时了吗?
而leveldb和上述两者就是完全不同的存储引擎了,LSM-TREE模型被大量使用于分布式数据库,如HBase,TiDB。mysql也推出了基于leveldb的存储引擎。
线程模型
redis是单线程模型,而memcached是多线程模型。这个设计上的差距也挺有意思的。为什么redis坚持单线程模型?而既然后来者redis的单线程模型被证明很成功,而memcached之前为什么要采用更加复杂的多线程模型呢?
redis单线程模型的成功得利于epoll这些异步非阻塞事件驱动模型的支持。同时由于redis的场景是IO密集型,并非计算密集型,现代CPU单核的计算能力完全够用,真正需要考虑的应该还是内存利用优化,已经网络带宽。而memcached采用多线程模型或许是有利于任务的切分。至少利用多核并没有很明显的优势。