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

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

需要考虑的要点:

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


当前回答

我有机会在我所研究的缓存代理中同时使用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上的基准的确提供了更多的苹果对苹果(同一张嘴)的比较。

一个非常简单的测试,可以针对redis-2.2.2和memcached设置和获取100k个唯一键和值。两者都在linux虚拟机(CentOS)上运行,我的客户端代码(粘贴在下面)在windows桌面上运行。

Redis公司

存储100000个值所需的时间=18954ms加载100000个值所需的时间=18328ms

Memcached(内存缓存)

存储100000个值所需的时间=797ms检索100000个值所需的时间=38984毫秒


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

Memcached是多线程和快速的。

Redis有很多功能,而且速度非常快,但完全限于一个内核,因为它基于一个事件循环。

我们两者都使用。Memcached用于缓存对象,主要减少数据库的读取负载。Redis用于诸如排序集之类的东西,这对于汇总时间序列数据非常方便。

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

Redis>

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

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

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

内存缓存>

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

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

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

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

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

希望这有帮助!!