redis优势这么多,为什么没有吧memcache干掉?

用户5547794389


在BAT做Java分布式开发的时候,少不了要用到缓存,而我也见证了我们的平台产品从用memcached到转换为redis。然而,虽然越来越多的人选择了redis,但是memcached面临的处境也仅仅是市场占有率缩水,而不是被彻底淘汰。

这与二者各有不同的优势有关。

存储效率

由于redis是单核以及IO复用,所以保证了存储速度,但是memcached可以使用多核,所以当平均每个核需要存储的数据小于100K的时候,redis还是性能很优异的,然而超过了这个数值之后,memcached的多核优势就开始显露出来了。虽然redis一直也在这方面努力改进,但是目前还是无法超越memcached的。

内存利用率

redis的一个优势的是支持存储set,hash,list,string等多种数据格式,而memcached虽然只能存储key-value格式的数据,但是却使它的内存利用率更加高。因此,如果你的使用场景用不到redis其余那么多的数据格式的话,不妨继续用memcached。

数据多样化

memcached除了支持key-value格式的数据,还能存储图片,视频等其他格式的数据,这点是redis望洋兴叹的。因此,对于一些大型网站,比如某美食推荐网站,就可以将一些热门餐厅的照片等信息存储在memcached中,从而减少对后台数据库的压力。

分布式扩展

memcached的另一个突出优点就是采用了可分布式扩展的模式,可以将多个memcached组成一个虚拟的服务端,对于调用者来说完全是黑盒的,提高了单机器的内存利用率。虽然redis也有主从机制,但是结合memcached的多核特点,这个特性就更加突出了。

我是苏苏思量,来自BAT的Java开发工程师,每日分享科技类见闻,欢迎关注我,与我共同进步。


苏苏思量


两者虽然有着子集的关系,但不得不说还有存在很多不同,而且彼此不能互相替代。就像有些面试官会问你【为什么要使用redis】的问题,也是因为有些场合,是根本不需要用到redis,或者说没必要用到哦。

简单说,这两者都是基于内存的数据缓存系统,我认为memcache实现的存储功能是redis的子集,即memcache能实现的存储,redis也能做到,但反之则不行。

比如说,memcache只支持简单的key/value数据结构,但是redis除了String外,还支持list、dict、set、zset、hyperloglog等等数据结构的存储。

其他的类似redis的持久化、redis的读写效率、redis的快照功能,都是比memcache要强大且完善的功能,但为何memcache还是存在,且有很多项目还是使用呢?

其主要的原因,在我看来,是因为场景的需要,比如:

1)项目中使用缓存存储时,只会对String数据结构进行存储,但redis在存储String类型时,会耗费更多的内存,我们需要对数据转换为dict来进行存储的压缩,从而减低内存损耗,在这种情况下,我会优先考虑memcache。

2)redis只支持单线程,其性能受限于CPU性能,即取决于数据结构、数据大小以及服务器硬件性能,其在日常环节中的QPS高峰约为1-2w,而memcache具有多核优势,其单实例的吞吐量极高,性能主要取决于存储的key及value的字节大小以及服务器硬件性能,其在日常环节中的QPS高峰约为4-6w。(但有意思的时,即使如此,memcache的性能比起redis,在实际业务中并没有好多少,但如果看过源码的人会发现,redis的源码及其精致!而memcache的源码则稍显臃肿,可能这一块也会有一定的影响呢?)


总的说:一昧的使用redis来进行数据缓存系统,并不是最佳的选择,如果项目根本就不需要复杂的数据结构呢?如果项目的数据只有一小部分使用了缓存,根本不需要使用持久化和备份呢?如果项目不需要在服务器之间进行数据同步呢?在诸如此类情况下,使用redis反而是增加项目成本,杀鸡焉用宰牛刀~


——没事待在家里不出门的 居家程序员 敲上。(我不想脱发!)


居家程序员


显示Memcache和Redis区别介绍:

在Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别之一的。

还有这个Redis在很多方面具备数据库的特征的,或者说就是一个数据库系统,而Memcache只是简单的K/V缓存的。

他们的扩展都需要做集群;实现方式:master-slave、Hash的。,不过在100k以上的数据中,Memcache性能要高于Redis的。

还有的话如果要说内存使用效率的话,使用简单的key-value存储的话,Memcached的内存利用率更高的。

而如果Redis采用hash结构来做key-value存储的,由于其组合式的压缩,其内存利用率会高于Memcache。所以当然,这和你的应用场景和数据特性有关的的。

如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis的,因为这两个特性Memcache都不具备的。

所以即使你只是希望在升级或者重启系统后缓存数据不会丢失的,选择Redis也是明智的选择得的。

还有虽然这个Redis和Memcache在写入性能上面差别不大的,读取性能上面尤其是批量读取性能上面Memcache更强的。

以上区别说明:memcache还是有可取之处的!!!

总结一下的::

最后这个Memcache:Memcache可以利用多核优势的,单实例吞吐量极高的,可以达到几十万QPS,适用于最大程度扛量的的。

他的话只支持简单的key/value数据结构的,不像Redis可以支持丰富的数据类型的。

无法进行持久化,数据不能备份,只能用于缓存使用,而且且重启后数据全部丢失的。。。。


我的内容我做主


1.memcached多线程,使用cas对数据加锁,而redis单线程。因为memcached多线程存在上下文开销,所以它性能上是比不过redis的。可以参考epoll一个线程处理请求,仍然能够支持上万并发(大对象除外,因为会被io拖慢引起阻塞。但互联网场景基本都是小数据量高并发的)。

2.然后redis数据结构多,还支持lua,各种集群模式,而且还可以存储当库用(虽然会有点小问题)。所以你会发现互联网公司前台系统用memcached是越来越少了,甚至我很多年没看到过了,都是redis。


拖延症_晚期_


用哪个内存库,取决于项目组成员熟悉哪个。强烈推荐Redis。Redis能实现的功能已经远远超出了缓存这一区域。Redis可以看作数据库的元数据。List是数据库列表。Hash是表项。KEY是索引。利用REDIS可以自己设计一个速度飞快的关系型数据库。


分享到:


相關文章: