当前位置: 首页 > 知识库问答 >
问题:

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

华凯捷
2023-03-14

Redis可以完成Memcached提供的所有功能(LRU缓存、项目过期和现在在3.x+版本中的集群,目前处于测试版),也可以通过TwemProxy这样的工具来完成。性能也是相似的。此外,Redis增加了持久性,因此在服务器重新启动时不需要进行缓存升温。

参考一些比较Redis和Memcache的旧答案,其中一些更倾向于Redis作为Memcache的替代(如果已经存在于堆栈中):

>

  • memcached与redis?

    与Redis相比,memcached是恐龙吗?

    Redis和Memcache还是只有Redis?

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

    到了2014年,当您已经有了一个Redis组件,可以完成memcached所能做的一切时,为什么memcached仍然值得作为附加组件被添加到堆栈中呢?除了现有的Redis之外,架构师/工程师还有哪些有利之处可以支持memcached?

    一些示例场景:

    • 按特定模式列出所有缓存的键,并读取或删除它们的值。在redis中非常容易,但在memcached中不容易。
    • 存储超过1MB的有效负载在redis中很容易实现,但需要在memcached中调整板大小,这本身就会产生性能副作用。
    • 当前缓存内容的简易快照
    • Redis集群和语言驱动程序都可以生产,因此集群部署也很容易。
  • 共有1个答案

    戴品
    2023-03-14

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

    关于memcached的其他优点:

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

    Memcache驱逐是按大小类执行的,并取决于其板分配器的实现细节。例如,如果您想添加一个适合给定大小类的项,memcached将尝试删除该类中过期的/最近未使用的项,而不是尝试全局尝试来理解对象是什么,而不管其大小如何,这是最佳候选项。

    Redis会在达到maxMemory限制时选择一个好的对象作为驱逐的候选对象,查看所有对象,而不考虑大小类,但只能提供一个近似好的对象,而不能提供空闲时间更长的最佳对象。

    Redis做这件事的方法是通过对几个对象进行采样,选择空闲(未访问)时间最长的对象。由于Redis3.0(目前处于beta阶段)的算法得到了改进,并且在逐出过程中也获得了很好的候选池,所以近似也得到了改进。在Redis文档中,您可以找到关于其工作方式的详细描述和图表。

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

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

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

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

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

     类似资料:
    • 问题内容: Redis可以执行Memcached提供的所有操作(LRU缓存,项目到期,现在在3.x +版本中,目前处于beta版,目前可以在集群中)或使用twemproxy之类的工具。性能也差不多。此外,Redis添加了持久性,因此在服务器重新启动时无需进行缓存预热。 尽管如此,在研究大型网络公司(如Instagram,Pinterest,Twitter等)的堆栈时,我发现他们同时将Memcach

    • 问题内容: 我目前有一个使用filebeat作为日志发送程序的体系结构,该结构将日志发送到日志存储索引器实例,然后发送到AWS中的托管elasticsearch。由于存在持续的TCP连接,因此我无法使用AWS ELB多个日志存储索引器实例进行负载平衡,因为文件信号始终会选择这些实例并将其发送到那里。所以我决定使用redis。现在,看到扩展redis并使之在ELK堆栈中具有高可用性组件是多么困难,我

    • redis为何那么快 1.完全基于内存实现 磁盘调用栈图 内存操作 内存直接由 CPU 控制,也就是 CPU 内部集成的内存控制器,所以说内存是直接与 CPU 对接,享受与 CPU 通信的最优带宽。 Redis 将数据存储在内存中,读写操作不会因为磁盘的 IO 速度限制,所以速度飞一般的感觉! 2.高效的数据结构 2.1 哈希表 哈希表,本质就是一个数组,每个元素被叫做哈希桶,不管什么数据类型,每

    • 本文向大家介绍介绍一下,堆与栈的不同是什么?相关面试题,主要包含被问及介绍一下,堆与栈的不同是什么?时的应答技巧和注意事项,需要的朋友参考一下 考察点:堆,栈 (1)Java的堆是一个运行时数据区,类的对象从中分配空间。通过比如:new等指令建立,不需要代码显式的释放,由垃圾回收来负责。 优点:可以动态地分配内存大小,垃圾收集器会自动回收垃圾数据。 缺点:由于其优点,所以存取速度较慢。 (2)栈:

    • Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的

    • 主要内容:Redis架构,Redis优势,Redis应用场景Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用 C 语言编写。 Redis 遵守 BSD 协议,实现了免费开源,其最新版本是 6.20,常用版本包括 3.0 、4.0、5.0。自 Redis 诞生以来,它以其超高的性能、完美的文档和简洁易懂的源码