首页 文章

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

提问于
浏览
76

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 回答

  • 111

    我今天看到的主要原因是作为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 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个新闻,以填充网站的"Newest"部分 . 你用Redis做的是拿一个列表(上限为M项)并插入最新的新闻 . 如果您使用另一个商店作为数据,并将Redis用作缓存,那么您在发布新项目时将填充两个视图(Redis和DB) . 没有缓存失效 .

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

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

  • 13

    习惯很难打破:)

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

    • Legacy - 熟悉Memcached的开发人员以及支持Memcached的应用程序 . 这也意味着它是一种成熟且经过良好测试的技术 .

    • 缩放 - 标准Memcached可以轻松地水平扩展,而Redis(直到和不包括即将发布的v3)需要更多的工作(即分片) .

    然而:

    • Re . 遗产 - 鉴于Redis的稳健性(数据结构,命令,持久性......),它正在积极开发,客户端以各种可想到的语言 - 新应用程序随之开发 .

    • 重新缩放 - 除了即将推出的v3之外,还有一些解决方案可以使缩放变得更加容易 . 例如,Redis Cloud提供无缝扩展,不会丢失数据或中断服务 . 缩放/分割Redis的另一种流行方法是twemproxy .

相关问题