Redis与Memcache的区别

从网络上看的几篇文章,手工记录一下,加强认知:

参考地址:

https://blog.csdn.net/chaoluo001/article/details/70740307

https://blog.csdn.net/hhjianlong/article/details/73928653

https://www.zhihu.com/question/19829601

共同点:

   Memcache和Redis

一、存储方式方面:

    1)Memcache 简单的Key-Value存储,重启后数据丢失,Memcache已开始做master-slave,但是成本比较大,业内用的不多。

    2)Redis 支持List,Set,Sort Set,Hash,...等多种存储模式,可以做master- N*slave节点,同时可以将数据存储到磁盘,当重启时可以加载数据。


二、内存管理方面:

   1)Memcache 使用预先分配内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据内存大小来选择合适的chunk存储,内存池减少了内存的申请和释放操作,并且能减小内存碎片产生,但是会造成一定的空间浪费,所以当内存还有空间时,新的数据也可能被剔除,,原因可以参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

   2)Reids 不会预先分配内存,每次新数据都会进行申请,会产生一定的内存碎片;redis根据存储命令参数,会把带过期时间的数据单独放在一起,将其称作为临时数据,非临时数据是永远不会删除的,即使内存不够导致swap也不会剔除非临时数据(会尝试剔除临时数据),这点上redis更适合做存储而不是cache。

   3)Reids和Memcache不一样,redis不会将所有数据一直存储在redis中,档内存用完时,会将部分数据swap到磁盘中,具体可以参考顶部的第三篇博客。

三、数据一致性方面:

    1)Memcache提供了cas命令,保证并发情况下同一数据的一致性问题。参考:http://langyu.iteye.com/blog/680052

 2)Reids提供了事务功能,保证了一串命令的原子性,中间不会被任何操作打断。参考:https://blog.csdn.net/d1562901685/article/details/54881862

四、网络IO模型:

   1)Memcache是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接收请求后,将连接描述子pipe传递给worker子线程,进行读写IO,网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗

         cache coherency 参考连接:http://www.infoq.com/cn/articles/cache-coherency-primer/   

         Memcached最常用的stats 参考连接:https://www.cnblogs.com/Alight/p/3546400.html

   2)Redis使用单线程的IO复用模型,封装了AeEvent事件处理框架,主要实现了epoll,kqueue和select,对于单存只有IO的操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,如排序和聚合等,这些操作,单线程模型实际会严重影响吞吐量,CPU计算过程中,整个IO调度都会被阻塞。


五、性能方面: 

       两者的性能方面都非常的出色,但是具体到细节方面,由于Redis使用单核,Memcache可以使用多核,所有平均每一个核上Redis在存储小数据时比Memcache性能更高。而在100K以上的数据,Memcache的性能要高于Reids,虽然Redis在存储大数据的性能上也做过优化,但是比起Memcache还是稍有逊色。  

       1)Memcache 单key最多存储1M的数据,超过1M会出现异常,同时value的值越大,读取性能越缓慢,同时不建议key的长度超过250,同时不能够遍历所有的Item。参考连接:https://www.cnblogs.com/shirly1981/p/5771786.html

      2)Reids 官网发布的是:redis的key和value 不允许超过512M,但是也不建议存储单key存储大量数据。关于Key的数量方面:Redis can handle up to 232 keys, and was tested in practice to handle at least 250 million of keys per instance。

      Redis的性能压测对比参考连接:https://www.zhihu.com/question/19599545

六、使用场景:

     1)Memcache: 适合多度少些,大数据量的情况,如大量查询用户信息、好友信息。

     2)Redis适用于对读写效率要求都很高,数据处理业务复杂和对安全性比较高的系统,如新浪微博的计算和微博发布系统。


总结:

    1)Redis的最佳使用方式是全部数据in-memory。

    2)Redis的更多长青是作为memcache的替代者使用。

    3)当需要使用除Key/value紫外的更多数据类型支持时,使用redis更合适。

    4)当存储的数据不能被剔除时,使用redis更合适。

  写到最后,还是没有太明白,Redis和Memcache 他俩的终极差异~~继续理解。

  最后再贴几篇文章便于后期理解:

 1)知乎的干货,如何选型Memcache和Redis:https://www.zhihu.com/question/19829601

 2)跨机房高可用Redis:https://cachecloud.github.io/2016/11/03/Redis%20Cluster多机房高可用实现/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值