Redis和Memcached有什么区别?

Redis里面也有键值对存储,也可以存在内存中,而且还支持持久化存储,而且redis的集群,分布式部署,镜像同步都是原生支持,比memcached要方便一些(memcached还得自己写一致性hash算法来判断某个key对应的value存储在哪个memcached节点上,很麻烦),那么memcached还有什么用呢?
为什么不直接全部都用redis替代memcache呢?
(我是看目前仍然有很多php教程,教科书都是讲memcached,提到redis的还是比较少,我也是看别人博客才知道有这么个东西的。)

阅读 10.5k
7 个回答

谢邀~~

之前外出没网,现在给题主一些我个人的观点以及一些参考资料,觉得有用的就取吧,有错也欢迎大家支持,觉得不错就点个赞咯~~~

首先我先说明一个观点:存在即合理,有人用说明它具有自身价值。

简述

memcached 和 redis 都很类似:都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。

那么题主说 memcached 的事情 redis 都可以做,那么为什么 memcached 还有人用?那是因为它们两者并不是完全可以相互替代的,它们也有各自的长短优缺点:

Memcached

Memcached的优点:

  • Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。

  • 适用于最大程度扛量,有效为服务器减压。

  • 支持直接配置为session handle。

  • 配置维护的坑比较少。

Memcached的局限性:

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

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

  • 无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。

  • Memcached内存分配采用Slab
    Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。

  • memcached服务端原生不支持水平扩展,必须在客户端编写缓存分布策略来实现分布式缓存,并且由于无法进行数据同步,因此生产环境中出现单机故障时可能会影响部分业务运行。

Redis

Redis的优点:

  • 支持多种数据结构,比如 string(字符串)、
    list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)等等。

  • 支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。

  • 支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。

  • 单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。

  • 支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。

  • 支持简单的事务需求,但业界使用场景很少,并不成熟。

Redis的局限性:

  • Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。

  • 支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。

  • Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。

总结

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

而且到底是用 redis 还是 memcached 这个还是看题主的需求,因为单纯是做缓存的话,memcached已经足够应付绝大部分的需求,redis 的出现只是提供了一个更加好的选择,但是不代表redis就能完全替代 memcached ,还是那句话,看你的需求是怎么样的。

按照技术的新旧来讲,redis 比 memcached 还更加新,但是成熟醒来说,memcached 应该更加好,再说现在潮流也有开始转投 mongodb了,因为redis 的数据库特征,mongodb更胜一筹。

很多公司的缓存策略中使用memcached的还是占大多数的,再者是redis,最后才是mongodb,发现没有,最新的技术在公司团队的应用还是需要时间的,旧的技术策略还是很多公司团队在用,因为技术成型而且稳定性要好,这也是memcached比redis要被提及的更多的原因。

看情况而定吧!

  • Memcached是多线程非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型

  • Memcached使用预分配的内存池的方式;Redis使用现场申请内存的方式来存储数据

  • Memcached的服务器端互相完全独立;Redis计划在服务器端内建对集群的支持

  • Memcached可以使用多核;Redis只使用单核

总之,使用简单的key-value存储的话,Memcached的内存利用率更高,当需要除key/value之外的更多数据类型支持时,使用Redis更合适。希望对你有帮助

Redis正在取代Memcached,但是你要知道,Redis是新东西,对于一个庞大的系统来说,要做到整体替换是需要时间的。
目前微博使用的就是Redis集群。

其实两者性能相近,但是redis性能会略好一些。
redis取代memcached是趋势。

memcached相对于redis社区更完善,更稳定.
新技术总是要时间沉淀

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏