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

Caching 如果redis已经是堆栈的一部分,为什么Memcached仍然与redis一起使用?,caching,redis,memcached,Caching,Redis,Memcached,Redis可以做Memcached提供的任何事情(LRU缓存、项目到期、现在3.x+版本中的集群,目前处于beta版)或使用twemproxy等工具。性能也差不多。此外,Redis增加了持久性,因此在服务器重新启动时无需进行缓存预热 参考一些比较Redis和Memcache的老答案,其中一些支持用Redis替代Memcache(如果已经存在于堆栈中): 尽管如此,在研究Instagram、Pinterest、Twitter等大型网络公司时,我发现他们使用Memcached和Red

Redis可以做Memcached提供的任何事情(LRU缓存、项目到期、现在3.x+版本中的集群,目前处于beta版)或使用twemproxy等工具。性能也差不多。此外,Redis增加了持久性,因此在服务器重新启动时无需进行缓存预热

参考一些比较Redis和Memcache的老答案,其中一些支持用Redis替代Memcache(如果已经存在于堆栈中):

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

从2014年开始,为什么memcached仍然值得作为附加组件添加到您的堆栈中,而您已经有了一个Redis组件,它可以做memcached所能做的一切?除了已经存在的Redis之外,还有哪些有利的方面使架构师/工程师仍然将memcached包括在内

更新: 对于我们的平台,我们完全放弃了Memcached,并使用redis满足普通和逻辑缓存需求。非常 性能优良,灵活可靠

一些示例场景:

  • 按特定模式列出所有缓存的键,并读取或删除它们的值。在redis中非常容易,在memcached中不可行(容易)
  • 存储超过1mb的有效负载在redis中很容易做到,需要在memcached中调整板大小,这本身就有性能方面的副作用
  • 当前缓存内容的简易快照
  • Redis cluster与语言驱动程序一起也可用于生产,因此集群部署也很容易
习惯很难打破:)

但认真地说,据我所知,Memcached仍然被使用的主要原因有两个:

  • 遗留-有熟悉Memcached的开发人员,以及支持Memcached的应用程序。这也意味着它是一项成熟且经过良好测试的技术
  • 缩放-标准Memcached很容易进行水平伸缩,而Redis(直到并排除即将发布的v3)需要更多的工作(即分片)
  • 然而:

  • Re。遗留-鉴于Redis的健壮性(数据结构、命令、持久性…),它正在积极开发,客户机使用各种可能的语言-新的应用程序通常使用它开发
  • 重新缩放-除了即将推出的v3,还有一些解决方案可以使缩放更加容易。例如,提供无缝扩展,无数据丢失或服务中断。另一种流行的缩放/分片Redis的方法是
    我今天将memcached视为Redis之上的一个用例的主要原因是,使用纯HTML片段缓存(或类似应用程序)应该能够获得更高的内存效率。如果您需要将对象的不同字段存储在不同的memcached键中,那么Redis散列将更加高效,但是当您有大量的键->简单字符串对时,memcached应该能够为您提供更多的每兆字节项

    memcached的其他优点:

    • 这是一段非常简单的代码,所以如果您只需要它提供的功能,我想这是一个合理的选择,但我从未在生产中使用过它
    • 它是多线程的,所以如果您需要在单框设置中进行扩展,这是一件好事,您只需要使用一个实例
    我相信,随着人们转向智能缓存,或者当他们试图通过Redis数据结构保存缓存数据的结构时,作为缓存的Redis变得越来越有意义

    比较Redis LRU和memcached LRU。 memcached和Redis都不执行真正的LRU逐出,但只是近似执行

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

    相反,当达到
    maxmemory
    限制时,Redis会尝试选择一个好对象作为逐出的候选对象,查看所有对象,而不管大小类别,但只能提供一个大致良好的对象,而不是空闲时间较长的最佳对象

    Redis实现这一点的方法是对一些对象进行采样,然后选择空闲(未访问)时间最长的对象。由于Redis 3.0(目前处于beta版)对算法进行了改进,并在逐出过程中获得了很好的候选池,因此近似值得到了改进。在公园里

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

    当Redis开始提高内存效率时 Redis能够以特殊的内存节省方式存储小型聚合数据类型。例如,表示对象的小Redis散列,在内部存储为二进制唯一blob,而不是散列表。因此,将每个对象的多个字段设置为哈希比将N个分开的键存储到memcached中更有效

    实际上,您可以将对象作为单个JSON(或二进制enc)存储到memcached中