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

时间:2014-05-12 05:28:04

标签: caching redis memcached

Redis可以完成Memcached提供的所有内容(LRU缓存,项目到期,现在在版本3.x +中进行集群,目前处于测试阶段)或者使用twemproxy等工具。性能也类似。更重要的是,Redis增加了持久性,因此在服务器重启时你不需要进行缓存加温。

引用比较Redis和Memcache的一些旧答案,其中一些有利于Redis替换Memcache(如果已经存在于堆栈中):

尽管如此,在研究Instagram,Pinterest,Twitter等大型网络公司的堆栈时,我发现他们将Memcached和Redis用于不同目的,而不是使用Redis进行主要缓存。主缓存仍然是Memcached,Redis用于基于数据结构的逻辑缓存。

截至2014年,为什么memcached仍然值得将额外的组件添加到堆栈中,当你已经拥有一个可以完成memcached可以做的所有事情的Redis组件时?除了现有的Redis之外,建筑师/工程师还有哪些优点还包括memcached?

更新:

对于我们的平台,我们完全放弃了Memcached,并将redis用于普通缓存和逻辑缓存要求。高度 高效,灵活,可靠。

一些示例场景:

  • 按特定模式列出所有缓存的密钥,并读取或删除它们的值。在redis中很容易,在memcached中不容易(很容易)。
  • 存储超过1mb的有效负载,在redis中很容易,需要在memcached中进行slab size调整,这会产生性能副作用。
  • 当前缓存内容的简易快照
  • Redis群集以及语言驱动程序也已准备就绪,因此群集部署也很容易。

2 个答案:

答案 0 :(得分:114)

我今天看到的主要原因是作为Redis上memcached的一个用例,你应该能够通过 plain HTML片段缓存(或类似的应用程序)获得更高的内存效率。如果您需要在不同的memcached键中存储对象的不同字段,那么Redis哈希将更有效地记忆,但是当您拥有大量密钥时 - > simple_string对,memcached应​​该能够为每兆字节提供更多项目。

关于memcached的其他好处:

  • 这是一段非常简单的代码,所以如果您只需要它提供的功能,我猜这是一个合理的选择,但我从未在生产中使用它。
  • 它是多线程的,因此如果您需要在单机框设置中进行扩展,这是一件好事,您只需要与一个实例进行对话。

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

Redis LRU和memcached LRU之间的比较。

memcached和Redis都没有执行真正的LRU驱逐,只是近似的那种。

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

当达到maxmemory限制时,Redis会尝试选择一个好对象作为驱逐候选者,查看所有对象,无论大小等级如何,但只能提供近似良好的对象,而不是具有更长空闲时间的最佳对象

Redis这样做的方法是对一些对象进行采样,选择空闲(未访问)的对象最长时间。自Redis 3.0(目前处于测试阶段)以来,该算法得到了改进,并且在驱逐期间也获得了良好的候选池,因此近似得到了改进。在Redis documentation you can find a description and graphs with details about how it works

为什么memcached的内存占用比Redis更好,因为简单的字符串 - >字符串映射。

Redis是一个更复杂的软件,因此Redis中的值以与高级编程语言中的对象更相似的方式存储:它们具有关联的类型,编码,用于内存管理的引用计数。这使得Redis内部结构良好且易于管理,但与仅处理字符串的memcached相比具有开销。

当Redis开始提高内存效率时

Redis能够以特殊的内存保存方式存储小型聚合数据类型。例如,表示对象的小Redis Hash内部存储的不是哈希表,而是存储为二进制唯一的blob。因此,将每个对象的多个字段设置为哈希比将N个分离的密钥存储到memcached中更有效。

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

Redis在智能缓存环境中的优势。

由于Redis数据结构,在缓存失效时使用memcached销毁对象的常用模式,以后再从DB中重新创建它,是使用Redis的原始方法。

例如,假设您需要缓存发布到Hacker News中的最新N新闻,以填充网站的“最新”部分。你用Redis做的是拿一个列表(上限为M项)并插入最新的新闻。如果您使用另一个商店作为数据,并将Redis用作缓存,那么您在发布新项目时将填充两个视图(Redis和数据库)。没有缓存失效。

但是,应用程序始终具有逻辑,因此如果发现Redis列表为空,例如在启动后,可以从DB重新创建初始视图。

通过使用智能缓存,与memcached相比,可以使用Redis以更有效的方式执行缓存,但并非所有问题都适合此模式。例如,HTML片段缓存可能无法从这种技术中受益。

答案 1 :(得分:13)

习惯很难打破:)

严重的是,有两个主要原因 - 据我所知 - 为什么仍然使用Memcached:

  1. Legacy - 熟悉Memcached的开发人员以及支持Memcached的应用程序。这也意味着它是一种成熟且经过良好测试的技术。
  2. 缩放 - 标准的Memcached可以轻松地水平扩展,而Redis(直到和不包括即将发布的v3)需要更多的工作(即分片)。
  3. 然而:

    1. 重新。遗产 - 给予Redis'稳健性(数据结构,命令,持久性......),它以各种可想到的语言积极开发和客户 - 新应用程序通常随之开发。
    2. 重新扩展 - 除了即将推出的v3之外,还有一些解决方案可以让扩展变得更加容易。例如,Redis Cloud提供无缝扩展,不会丢失数据或中断服务。另一种缩放/分片Redis的流行方法是twemproxy