我们正在使用带有Redis服务器的Ruby web应用程序进行缓存。是否需要测试Memcached?

什么能给我们更好的表现?Redis和Memcached有什么优缺点吗?

需要考虑的要点:

读/写速度。内存使用情况。磁盘I/O转储。缩放比例。


当前回答

如果你对性能感兴趣,Memcached会更快,甚至因为Redis涉及网络(TCP调用)。内部Memcache也更快。

正如其他答案所提到的那样,Redis有更多的功能。

其他回答

这太长了,不能作为已经接受的答案的评论发布,所以我将其作为单独的答案

还需要考虑的一件事是,是否希望对缓存实例设置硬内存上限。

由于redis是一个具有大量功能的nosql数据库,并且缓存是它唯一可以使用的选项,所以它可以根据需要分配内存-你在其中放置的对象越多,它使用的内存就越多。maxmemory选项没有严格执行内存使用上限。当您使用缓存时,密钥被收回并过期;很可能您的密钥大小不尽相同,因此会出现内部内存碎片。

默认情况下,redis使用jemalloc内存分配器,它尽力做到内存紧凑和快速,但它是一个通用内存分配器,无法跟上高速率的大量分配和对象清除。正因为如此,在某些加载模式下,redis进程显然会因为内部碎片而泄漏内存。例如,如果您有一台具有7 Gb RAM的服务器,并且希望将redis用作非持久性LRU缓存,您可能会发现,随着时间的推移,将maxmemory设置为5Gb的redis进程将使用越来越多的内存,最终达到总RAM限制,直到内存不足杀手干扰。

memcached更适合上述场景,因为它以完全不同的方式管理内存。memcached分配了一大块内存,这是它所需要的一切,然后使用自己实现的slab分配器自行管理这些内存。此外,memcached努力保持内部碎片较低,因为它实际上使用了每片LRU算法,当考虑到对象大小时进行LRU驱逐。

尽管如此,memcached在内存使用必须强制执行和/或可预测的环境中仍然具有强大的地位。我们已经尝试使用最新的稳定redis(2.8.19)作为基于非持久性LRU的memcached替换,在10-15k op/s的工作负载下,它会大量泄漏内存;由于同样的原因,亚马逊的ElastiCache redis实例在一天左右的时间内崩溃。

Memcached擅长作为一个简单的键/值存储,并且擅长执行key=>STRING。这使得它非常适合会话存储。

Redis擅长做key=>SOME_OOBJECT。

这真的取决于你要放什么。我的理解是,就性能而言,他们相当均衡。

如果你确实找到了一些客观的基准,也祝你好运。

我有机会在我所研究的缓存代理中同时使用memcached和redis,让我向您分享我使用了什么以及背后的原因。。。。

Redis>

1) 用于在集群上索引缓存内容。我在redis集群上有超过十亿个密钥,redis响应时间非常短且稳定。

2) 基本上,它是一个键/值存储,所以无论在应用程序中有什么类似的东西,都可以使用redis而不必太麻烦。

3) Redis持久性、故障切换和备份(AOF)将使您的工作更轻松。

内存缓存>

1) 是的,可以用作缓存的优化内存。我使用它来存储缓存内容,这些内容经常被访问(每秒50次),大小小于1MB。

2) 当我的单个内容大小>1MB时,我也只为memcached分配了16GB中的2GB。

3) 随着内容增长接近极限,我偶尔会在统计数据中观察到较高的响应时间(redis的情况并非如此)。

如果你要求整体体验,Redis是绿色的,因为它易于配置,非常灵活,具有稳定的健壮功能。

此外,在这个链接上有一个可用的基准测试结果,下面是来自同一链接的几个亮点,

希望这有帮助!!

剩下的最大原因是专业化。

Redis可以做很多不同的事情,其中一个副作用是开发人员可能会在同一个实例上使用很多不同的功能集。如果您将Redis的LRU功能用于非LRU的缓存,则完全有可能耗尽内存。

如果您打算设置一个专用的Redis实例,仅作为LRU实例使用,以避免出现这种情况,那么在Memcached上使用Redis并没有什么令人信服的理由。

如果您需要可靠的“永不停机”LRU缓存。。。Memcached将符合这一要求,因为它不可能在设计上耗尽内存,而且专用功能阻止开发人员尝试将其制作成可能危及内存的东西。简单的关注点分离。

如果你不介意粗鲁的写作风格,从可用性的角度来看,Systoilet博客上的Redis vs Memcached值得一读,但在对性能做出任何结论之前,一定要反复阅读评论;存在一些方法上的问题(单线程忙循环测试),自本文撰写以来,Redis也做了一些改进。

没有一个基准链接是完整的,不会有点混淆,所以也可以在Dormondo的LiveJournal和Antirez Weblog上查看一些冲突的基准。

编辑——正如Antirez所指出的,Systoilet分析是相当不合理的。即使在单线程不足的情况下,这些基准测试中的大部分性能差异也可以归因于客户端库,而不是服务器吞吐量。Antirez Weblog上的基准的确提供了更多的苹果对苹果(同一张嘴)的比较。