如果redis已经是堆栈的一部分,为什么Memcached仍然和Redis一起使用?
Redis可以完成Memcached提供的所有function(LRUcaching,项目过期,现在在3.x +版本中进行集群,目前处于testing阶段),或者使用twemproxy等工具。 性能也类似。 更重要的是,Redis增加了持久性,因为在服务器重启的情况下你不需要进行caching加温。
参考比较Redis和Memcache的一些旧的答案,其中一些支持Redis作为Memcache的replace(如果已经存在于堆栈中):
-
Memcached与Redis?
-
与Redis相比,memcached是一个恐龙吗?
-
Redis和Memcache还是Redis?
尽pipe如此,在研究Instagram,Pinterest,Twitter等大型networking公司的堆栈时,我发现它们同时使用Memcached和Redis来达到不同的目的,而不是使用Redis来进行主caching。 主高速caching仍然是Memcached,Redis用于其基于逻辑高速caching的数据结构。
从2014年开始,当你已经有一个可以完成memcached所能做的一切的Redis组件时,为什么memcached仍然值得作为附加组件添加到你的堆栈中。 build筑师/工程师倾向于将已经存在的Redis之外的memcached包括在内,有什么好处呢?
更新:
对于我们的平台,我们已经完全丢弃了Memcached,并且使用redis来实现简单以及逻辑caching的要求。 高性能,灵活可靠。
一些示例场景:
- 按特定模式列出所有caching的密钥,并读取或删除其值。 在redis中非常容易,在memcached中不可行(很容易)。
- 存储有效负载超过1MB,容易在redis中执行,需要在memcached中resize,这对性能产生了副作用。
- 当前caching内容的简单快照
- Redis集群也随着语言驱动程序一起生产,因此集群部署也很容易。
我今天看到,作为memcached over Redis的用例,主要原因是使用普通的 HTML片段caching(或类似的应用程序)可以获得更高的内存效率。 如果你需要在不同的memcached密钥中存储对象的不同字段,那么Redis哈希会更有效率,但是当你有大量的key – > simple_string对,memcached应该能够给你更多的项目兆字节。
其他一些关于memcached的好处:
- 这是一个非常简单的代码,所以如果你只是需要它提供的function,这是一个合理的select我猜,但我从来没有在生产中使用它。
- 它是multithreading的,所以如果你需要在一个单一的框架中进行扩展,这是一件好事,你只需要谈一个实例。
我相信随着人们走向智能caching,或者当他们试图通过Redis数据结构来保存caching数据的结构时,Redis作为caching变得越来越有意义。
Redis LRU和memcached LRU之间的比较
memcached和Redis都不会执行真正的LRU驱逐,而只是一个近似值。
Memcache逐出是每个大小的类,并取决于它的板分配器的实现细节。 例如,如果要添加适合给定大小类的项目,则memcached将尝试删除该类中的过期/不最近使用的项目,而不是尝试全局尝试理解该对象,而不pipe大小,这是最好的候选人。
相反,当达到maxmemory
限制时,Redis会尝试挑选一个好的对象作为驱逐的候选对象,无论大小类别如何,都会查看所有对象,但只能提供一个近似好的对象,而不能提供更好的对象空闲时间。
Redis这样做的方式是抽取一些对象,挑选最长时间闲置(未访问)的对象。 自从Redis 3.0(目前处于testing阶段)以来,algorithm得到了改进,并且在驱逐之间也获得了很好的候选集合,所以近似得到了改进。 在Redis文档中,您可以find有关其工作原理的详细说明和图表 。
为什么对于简单的string – >string映射,memcached比Redis具有更好的内存占用。
Redis是一个更为复杂的软件,因此Redis中的值存储方式与高级编程语言中的对象更相似:它们具有关联的types,编码和用于内存pipe理的引用计数。 这使得Redis的内部结构很好并且易于pipe理,但是与只处理string的memcached相比,开销更大。
当Redis开始更有记忆效率
Redis能够以特殊的内存保存方式存储小型聚合数据types。 例如,一个代表一个对象的小Redis哈希表,不是用散列表而是用一个二进制唯一的blob来存储的。 因此,将每个对象的多个字段设置为散列比将N个分隔的键存储到memcached中效率更高。
实际上,您可以将对象作为单个JSON(或二进制编码)存储到memcached中,但与Redis相反,这不会允许您获取或更新独立的字段。
Redis在智能caching环境中的优势。
由于Redis数据结构,caching失效时使用memcached的常用模式(以后从DB重新创build它)是使用Redis的原始方式。
例如,假设您需要caching发布到Hacker News中的最新N个消息,以填充网站的“最新”部分。 你对Redis做的事情是插入一个最新消息列表(加上M项)。 如果您使用另一个存储来存储数据,并使用Redis作为caching,则在发布新项目时,您所做的是填充这两个视图(Redis和数据库)。 没有caching失效。
但是,应用程序总是可以有逻辑,所以如果发现Redis列表是空的,例如在启动之后,可以从DB重新创build初始视图。
通过使用智能caching,与memcached相比,使用Redis可以更高效地执行caching,但并不是所有的问题都适合这种模式。 例如,HTML片段caching可能不会从这种技术中受益。
习惯很难打破:)
说真的,有两个主要原因 – 据我的理解 – 为什么Memcached仍然被使用:
- 传统 – 那里的开发人员对Memcached以及支持它的应用程序都很熟悉和熟悉。 这也意味着它是一个成熟和经验丰富的技术。
- 标准化Memcached可以轻松横向扩展,而Redis(直到并排除即将发布的v3)需要更多的工作(即分片)。
然而:
- 回覆。 遗留下来的 – 由于Redis的健壮性(数据结构,命令,持久性…),正在积极开发和客户端在每一个可以想象的语言 – 通常与它一起开发新的应用程序。
- 再缩放 – 除了即将到来的V3之外,还有一些解决scheme可以使缩放更容易。 例如, Redis Cloud提供无缝扩展,而不会造成数据丢失或服务中断。 另一种扩展/分片Redis的stream行方法是twemproxy 。