如果redis已经是堆栈的一部分,为什么Memcached仍然和Redis一起使用?

Redis可以完成Memcached提供的所有function(LRUcaching,项目过期,现在在3.x +版本中进行集群,目前处于testing阶段),或者使用twemproxy等工具。 性能也类似。 更重要的是,Redis增加了持久性,因为在服务器重启的情况下你不需要进行caching加温。

参考比较Redis和Memcache的一些旧的答案,其中一些支持Redis作为Memcache的replace(如果已经存在于堆栈中):

  • Memcached与Redis?

  • 与Redis相比,memcached是一个恐龙吗?

  • Redis和Memcache还是Redis?

尽pipe如此,在研究Instagram,Pinterest,Twitter等大型networking公司的堆栈时,我发现它们同时使用Memcached和Redis来达到不同的目的,而不是使用Redis来进行主caching。 主高速caching仍然是Memcached,Redis用于其基于逻辑高速caching的数据结构。

从2014年开始,当你已经有一个可以完成memcached所能做的一切的Redis组件时,为什么memcached仍然值得作为附加组件添加到你的堆栈中。 build筑师/工程师倾向于将已经存在的Redis之外的memcached包括在内,有什么好处呢?

更新:

对于我们的平台,我们已经完全丢弃了Memcached,并且使用redis来实现简单以及逻辑caching的要求。 高性能,灵活可靠。

一些示例场景:

  • 按特定模式列出所有caching的密钥,并读取或删除其值。 在redis中非常容易,在memcached中不可行(很容易)。
  • 存储有效负载超过1MB,容易在redis中执行,需要在memcached中resize,这对性能产生了副作用。
  • 当前caching内容的简单快照
  • Redis集群也随着语言驱动程序一起生产,因此集群部署也很容易。

我今天看到,作为memcached over Redis的用例,主要原因是使用普通的 HTML片段caching(或类似的应用程序)可以获得更高的内存效率。 如果你需要在不同的memcached密钥中存储对象的不同字段,那么Redis哈希会更有效率,但是当你有大量的key – > simple_string对,memcached应​​该能够给你更多的项目兆字节。

其他一些关于memcached的好处:

  • 这是一个非常简单的代码,所以如果你只是需要它提供的function,这是一个合理的select我猜,但我从来没有在生产中使用它。
  • 它是multithreading的,所以如果你需要在一个单一的框架中进行扩展,这是一件好事,你只需要谈一个实例。

我相信随着人们走向智能caching,或者当他们试图通过Redis数据结构来保存caching数据的结构时,Redis作为caching变得越来越有意义。

Redis LRU和memcached LRU之间的比较

memcached和Redis都不会执行真正的LRU驱逐,而只是一个近似值。

Memcache逐出是每个大小的类,并取决于它的板分配器的实现细节。 例如,如果要添加适合给定大小类的项目,则memcached将尝试删除该类中的过期/不最近使用的项目,而不是尝试全局尝试理解该对象,而不pipe大小,这是最好的候选人。

相反,当达到maxmemory限制时,Redis会尝试挑选一个好的对象作为驱逐的候选对象,无论大小类别如何,都会查看所有对象,但只能提供一个近似好的对象,而不能提供更好的对象空闲时间。

Redis这样做的方式是抽取一些对象,挑选最长时间闲置(未访问)的对象。 自从Redis 3.0(目前处于testing阶段)以来,algorithm得到了改进,并且在驱逐之间也获得了很好的候选集合,所以近似得到了改进。 在Redis文档中,您可以find有关其工作原理的详细说明和图表 。

为什么对于简单的string – >string映射,memcached比Redis具有更好的内存占用。

Redis是一个更为复杂的软件,因此Redis中的值存储方式与高级编程语言中的对象更相似:它们具有关联的types,编码和用于内存pipe理的引用计数。 这使得Redis的内部结构很好并且易于pipe理,但是与只处理string的memcached相比,开销更大。

当Redis开始更有记忆效率

Redis能够以特殊的内存保存方式存储小型聚合数据types。 例如,一个代表一个对象的小Redis哈希表,不是用散列表而是用一个二进制唯一的blob来存储的。 因此,将每个对象的多个字段设置为散列比将N个分隔的键存储到memcached中效率更高。

实际上,您可以将对象作为单个JSON(或二进制编码)存储到memcached中,但与Redis相反,这不会允许您获取或更新独立的字段。

Redis在智能caching环境中的优势。

由于Redis数据结构,caching失效时使用memcached的常用模式(以后从DB重新创build它)是使用Redis的原始方式。

例如,假设您需要caching发布到Hacker News中的最新N个消息,以填充网站的“最新”部分。 你对Redis做的事情是插入一个最新消息列表(加上M项)。 如果您使用另一个存储来存储数据,并使用Redis作为caching,则在发布新项目时,您所做的是填充这两个视图(Redis和数据库)。 没有caching失效。

但是,应用程序总是可以有逻辑,所以如果发现Redis列表是空的,例如在启动之后,可以从DB重新创build初始视图。

通过使用智能caching,与memcached相比,使用Redis可以更高效地执行caching,但并不是所有的问题都适合这种模式。 例如,HTML片段caching可能不会从这种技术中受益。

习惯很难打破:)

说真的,有两个主要原因 – 据我的理解 – 为什么Memcached仍然被使用:

  1. 传统 – 那里的开发人员对Memcached以及支持它的应用程序都很熟悉和熟悉。 这也意味着它是一个成熟和经验丰富的技术。
  2. 标准化Memcached可以轻松横向扩展,而Redis(直到并排除即将发布的v3)需要更多的工作(即分片)。

然而:

  1. 回覆。 遗留下来的 – 由于Redis的健壮性(数据结构,命令,持久性…),正在积极开发和客户端在每一个可以想象的语言 – 通常与它一起开发新的应用程序。
  2. 再缩放 – 除了即将到来的V3之外,还有一些解决scheme可以使缩放更容易。 例如, Redis Cloud提供无缝扩展,而不会造成数据丢失或服务中断。 另一种扩展/分片Redis的stream行方法是twemproxy 。