redis和memcached选择,对比分析

   memcache和redis是互联网分层架构中,最常用的KV缓存。不少同学在选型的时候会纠结,到底是选择memcache还是redis?

   memcache提供的功能是redis提供的功能的子集,不用想太多,选redis准没错?

   

redis倾向:

   复杂的数据结构:value是哈希,列表,集合,有序集合这类复杂的数据结构时,会选择redis,因为mc无法满足这些需求。用户订单列表,用户消息,帖子评论列表等。

   持久化: mc无法满足持久化的需求,只得选择redis。但是千万不要把redis真的做数据库用

                     a. redis的定期快照不能保证数据不丢失

                     b.redis的AOF会降低效率,并且不能支持太大的数据量

                     c.不要期望redis做固化存储会比mysql做得好,不同的工具做各自擅长的事情

                     d.redis挂掉重启后能够快速恢复热数据,但是如果着期间有数据修改,可能导致数据不一致,因此,只读场景,或者允许一些不一致的业务场景,可以尝试开启redis的固化功能

   自带高可用集群: redis自身支持集群,实现主从读写分离功能,官方也提供sentinal哨兵的集群管理工具,实现主从监控,故障转移,memcached实现集群需要二次开发了

                            但是很多时候需要考虑,真的需要高可用么?缓存很多时候是运行cache miss的,cache挂了可以读db的

  存储的内容比较大 : macache 单个value最大存储 1M,超过1M只能用redis了。

            注意:纯的k-v 而且数据量特别大,并发也很大 或许使用memcache更合适

                      a.内存分配:memcache使用 预分配内存池的烦事管理内存,更节省内存分配时间,redis使用临时申请的方式,kennel导致碎片。对比看memcache更快一点

                      b.memcache把所有的数据存储在物理内存里。redis有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上。对比看数据量大时,memcache更快一点

                      c.memcache使用非阻塞IO复用模型,redis也是使用非阻塞IO复用模型,但由于redis还提供一些非KV存储之外的排序,聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度。从这一点上,由于redis提供的功能较多,mc会更快一些。

                      d.memcache使用多线程,主线程监听,worker子线程接受请求,执行读写,这个过程中,可能存在锁冲突。redis使用单线程,虽无锁冲突,但难以利用多核的特性提升整体吞吐量。从这一点上,mc会快一些。

 

    代码可读性,代码质量:看过mc和redis的代码,从可读性上说,redis是我见过代码最清爽的软件,甚至没有之一,或许简单是redis设计的初衷,编译redis甚至不需要configure,不需要依赖第三方库,一个make就搞定了。而memcache,可能是考虑了太多的扩展性,多系统的兼容性,代码不清爽,看起来费劲。

  

  

   

 

                 

  

  

  

posted @ 2018-08-27 13:57  helloworldlee  阅读(2619)  评论(0编辑  收藏  举报