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

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

需要考虑的要点:

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


当前回答

这是亚马逊提供的非常棒的文章/差异

与memcached相比,Redis显然是赢家。

Memcached只有一个加分项它是多线程和快速的。Redis有很多很棒的功能,速度非常快,但仅限于一个内核。

Memcached不支持Redis的优点

快照-用户可以拍摄Redis缓存的快照并在任何时间点的辅助存储。内置支持许多数据结构,如Set、Map、SortedSet、,列表、BitMaps等。在redis中支持Lua脚本

其他回答

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

如果我们说redis是(缓存+数据结构)的组合,而memcached只是一个缓存,那就不会错。

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

Redis>

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

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

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

内存缓存>

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

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

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

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

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

希望这有帮助!!

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

Redis擅长做key=>SOME_OOBJECT。

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

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

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

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

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

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