缓存技术Memcached与Redis的终极大PK

一、在网络IO模型方面
Memcached:
1、Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程
2、监听线程监听网络连接,接受请求后,将连接描述字pipe传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库
3、多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗
Redis:
1、Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent 事件处理框架,主要实现了epoll、kqueue 和 select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大
2、Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的

二、在内存管理方面
Memcached:
1、Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除
Redis:
1、Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis根据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache

三、在数据一致性方面
Memcached:
1、提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题
Redis:
1、没有提供cas命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串命令的原子性,中间不会被任何操作打断
四、在存储方式方面
Memcached:
1、只支持简单的key-value存储
Redis:
1、Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构

五、在集群实现方面
Memcached:
1、Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储
2、客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点
Redis:
1、支持服务器端构建分布式存储Redis Cluster

六、终极大PK
1、性能上讲,Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k 以上的数据中,Memcached 性能要高于 Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色
2、内存使用率上,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached
3、数据操作上,Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择
4、相比于Memcached,Redis具备更多的功能,如数据持久化、事务、发布/订阅、Lua脚本、内置服务器端集群模块

猜你喜欢

转载自blog.csdn.net/Apeopl/article/details/82660349