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

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

需要考虑的要点:

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


当前回答

我们认为Redis是我们工作项目的一个负载起飞点。我们认为通过在nginx中使用一个名为HttpRedis2Module的模块或类似的模块,我们会有惊人的速度,但当使用AB测试进行测试时,我们被证明是错误的。

也许是模块坏了,或者是我们的布局,但这是一个非常简单的任务,用php获取数据然后将其填充到MongoDB中甚至更快。我们使用APC作为缓存系统,并使用php和MongoDB。它比nginxRedis模块快得多。

我的建议是自己测试它,这样做会向您展示环境的结果。我们决定在我们的项目中使用Redis是不必要的,因为它没有任何意义。

其他回答

我们认为Redis是我们工作项目的一个负载起飞点。我们认为通过在nginx中使用一个名为HttpRedis2Module的模块或类似的模块,我们会有惊人的速度,但当使用AB测试进行测试时,我们被证明是错误的。

也许是模块坏了,或者是我们的布局,但这是一个非常简单的任务,用php获取数据然后将其填充到MongoDB中甚至更快。我们使用APC作为缓存系统,并使用php和MongoDB。它比nginxRedis模块快得多。

我的建议是自己测试它,这样做会向您展示环境的结果。我们决定在我们的项目中使用Redis是不必要的,因为它没有任何意义。

这里没有指出的一个主要区别是Memcache始终有内存上限,而Redis在默认情况下没有(但可以配置为)。如果您总是希望在一定时间内存储一个键/值(并且永远不会因为内存不足而将其逐出),那么您需要使用Redis。当然,你也有内存不足的风险。。。

测验运行一些简单的基准测试。很长一段时间以来,我认为自己是一只老派犀牛,因为我主要使用memcached,并认为Redis是一个新孩子。

在我目前的公司中,Redis被用作主缓存。当我深入研究了一些性能统计数据并简单地开始测试时,Redis在性能方面与MySQL相当,或者说比MySQL慢得最少。

Memcached虽然过于简单,却让Redis彻底破产。它的规模更大:

对于较大的值(需要改变楼板尺寸,但已完成)对于多个并发请求

此外,在我看来,memcached驱逐策略实现得更好,从而在处理比缓存所能处理的数据更多的数据时,总体上平均响应时间更稳定。

一些基准测试表明,在我们的情况下,Redis的表现非常糟糕。我认为这与许多变量有关:

运行Redis的硬件类型存储的数据类型获取和设置的数量应用程序的并发性你需要数据结构存储吗

就我个人而言,我不同意Redis作者对并发和多线程的看法。

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

Redis>

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

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

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

内存缓存>

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

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

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

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

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

希望这有帮助!!

一个非常简单的测试,可以针对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");