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用于普通缓存和逻辑缓存要求。高度 高效,灵活,可靠。
一些示例场景:
答案 0 :(得分:114)
我今天看到的主要原因是作为Redis上memcached的一个用例,你应该能够通过 plain HTML片段缓存(或类似的应用程序)获得更高的内存效率。如果您需要在不同的memcached键中存储对象的不同字段,那么Redis哈希将更有效地记忆,但是当您拥有大量密钥时 - > simple_string对,memcached应该能够为每兆字节提供更多项目。
关于memcached的其他好处:
我相信当人们转向智能缓存或者他们试图通过Redis数据结构保留缓存数据的结构时,Redis作为缓存变得越来越有意义。
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。
Redis是一个更复杂的软件,因此Redis中的值以与高级编程语言中的对象更相似的方式存储:它们具有关联的类型,编码,用于内存管理的引用计数。这使得Redis内部结构良好且易于管理,但与仅处理字符串的memcached相比具有开销。
Redis能够以特殊的内存保存方式存储小型聚合数据类型。例如,表示对象的小Redis Hash内部存储的不是哈希表,而是存储为二进制唯一的blob。因此,将每个对象的多个字段设置为哈希比将N个分离的密钥存储到memcached中更有效。
实际上,您可以将对象作为单个JSON(或二进制编码)blob存储到memcached中,但与Redis相反,这将不允许您获取或更新独立字段。
由于Redis数据结构,在缓存失效时使用memcached销毁对象的常用模式,以后再从DB中重新创建它,是使用Redis的原始方法。
例如,假设您需要缓存发布到Hacker News中的最新N新闻,以填充网站的“最新”部分。你用Redis做的是拿一个列表(上限为M项)并插入最新的新闻。如果您使用另一个商店作为数据,并将Redis用作缓存,那么您在发布新项目时将填充两个视图(Redis和数据库)。没有缓存失效。
但是,应用程序始终具有逻辑,因此如果发现Redis列表为空,例如在启动后,可以从DB重新创建初始视图。
通过使用智能缓存,与memcached相比,可以使用Redis以更有效的方式执行缓存,但并非所有问题都适合此模式。例如,HTML片段缓存可能无法从这种技术中受益。
答案 1 :(得分:13)
严重的是,有两个主要原因 - 据我所知 - 为什么仍然使用Memcached:
然而: