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

标签 caching redis memcached

Redis 可以完成 Memcached 提供的所有功能(LRU 缓存、项目到期,现在在 3.x+ 版本中进行集群,目前处于测试阶段)或通过 twemproxy 之类的工具。性能也差不多。此外,Redis 增加了持久性,因此您无需在服务器重启时进行缓存预热。
引用一些比较 Redis 和 Memcache 的旧答案,其中一些支持 Redis 作为 Memcache 的替代品(如果已经存在于堆栈中):

  • Memcached vs. Redis?
  • Is memcached a dinosaur in comparison to Redis?
  • Redis and Memcache or just Redis?

  • 尽管如此,在研究 Instagram、Pinterest、Twitter 等大型网络公司的堆栈时,我发现他们将 Memcached 和 Redis 用于不同的目的,而不是将 Redis 用于主要缓存。主缓存仍然是Memcached,Redis用于其基于数据结构的逻辑缓存。
    截至 2014 年,当您已经拥有一个可以完成 memcached 所能做的一切的 Redis 组件时,为什么 memcached 仍然值得将其作为附加组件添加到您的堆栈中?除了已经存在的 Redis 之外,架构师/工程师倾向于仍然包含 memcached 的优点是什么?
    更新:
    对于我们的平台,我们完全放弃了 Memcached,并使用 redis 来满足普通和逻辑缓存要求。高度
    高性能、灵活和可靠。
    一些示例场景:
  • 按特定模式列出所有缓存的键,并读取或删除它们的值。在 redis 中很容易,在 memcached 中不可行(很容易)。
  • 存储超过 1mb 的有效负载,在 redis 中很容易做到,需要在 memcached 中调整slab 大小,这有其自身的性能副作用。
  • 当前缓存内容的简单快照
  • Redis 集群与语言驱动程序一起已做好生产准备,因此集群部署也很容易。
  • 最佳答案

    我今天将 memcached 视为基于 Redis 的用例的主要原因是您应该能够通过纯 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 哈希在内部存储,而不是使用哈希表,而是作为二进制唯一 blob 存储。因此,将每个对象的多个字段设置为散列比将 N 个分隔的键存储到 memcached 中更有效。

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

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

    由于 Redis 的数据结构,当缓存失效时,memcached 使用的通常模式是销毁对象,稍后从数据库中重新创建它,这是使用 Redis 的一种原始方式。

    例如,假设您需要缓存发布到 Hacker News 中的最新 N 条新闻,以便填充站点的“最新”部分。你用 Redis 做的是获取一个插入最新新闻的列表(最多 M 个项目)。如果您为数据使用另一个存储,并使用 Redis 作为缓存,那么您要做的是在发布新项目时填充两个 View (Redis 和数据库)。没有缓存失效。

    但是,应用程序始终可以具有逻辑,以便如果发现 Redis 列表为空,例如在启动后,可以从数据库重新创建初始 View 。

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

    关于caching - 如果 redis 已经是堆栈的一部分,为什么 Memcached 仍然与 Redis 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23601622/

    相关文章:

    caching - 清除Plone的CSS缓存的最佳方法是什么?

    c# - 使用 C# 控制台应用程序缓存 MYSQL 结果

    ruby-on-rails - 使用 nginx redis 和 sidekiq 的 Rails 4.2 负载平衡

    java - 有什么方法可以获取自定义对象中的所有数据类型吗?

    http - 缓存控制 :max-age=0 and If-Not-Modified in http request

    python - 在写入它的函数内部或全局外部打开与 Redis 数据库的连接是一种好习惯吗?

    Redis如何重置缓存命中超时?

    java - EC2 实例上 Tomcat 的 Memcached session 管理器,具有自动缩放属性

    django - 如何使用查询参数让服务器删除 API 调用缓存(django、DRF)

    c# - 如何从 lambda 表达式中获取唯一字符串