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

Dhr*_*hak 81 memcached caching redis

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大小,这会产生自身的性能副作用.
  • 轻松快照当前缓存内容
  • Redis集群以及语言驱动程序也可以生产,因此集群部署也很容易.

ant*_*rez 116

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

关于memcached的其他好处:

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

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

Redis LRU和memcached LRU之间的比较.

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

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

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

Redis这样做的方法是对几个对象进行采样,选择空闲(未访问)的对象最长时间.自Redis 3.0(目前处于测试阶段)以来,该算法得到了改进,并且在驱逐期间也获得了良好的候选池,因此近似得到了改进.在Redis文档中,您可以找到描述和图表,其中包含有关其工作原理的详细信息.

为简单的字符串 - >字符串映射,为什么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和DB).没有缓存失效.

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

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

  • 我试图改进回复.感谢您的反馈. (3认同)
  • 上述"智能"的另一个方面,或通过操作和/或脚本利用Redis的数据类型和服务器端逻辑,可以节省应用程序的复杂性和网络(正如@antirez在http: //antiz.com/news/73和Yiftach在http://redislabs.com/blog/the-proven-redis-performance上. (3认同)
  • 优秀的答案,要爱Redis的父亲与社区的关系. (3认同)

Ita*_*ber 13

习惯很难打破:)

但说真的,有两个主要原因 - 据我所知 - 为什么仍然使用Memcached:

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

然而:

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