从网络上看的几篇文章,手工记录一下,加强认知:
参考地址:
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多机房高可用实现/