Caching Memcached vs.Redis?
我们正在使用带服务器的Ruby web应用程序进行缓存。是否有一点需要测试 什么能给我们带来更好的表现?Redis和Memcached之间有什么利弊 需要考虑的要点:Caching Memcached vs.Redis?,caching,web-applications,memcached,redis,Caching,Web Applications,Memcached,Redis,我们正在使用带服务器的Ruby web应用程序进行缓存。是否有一点需要测试 什么能给我们带来更好的表现?Redis和Memcached之间有什么利弊 需要考虑的要点: 读/写速度 内存使用 磁盘I/O转储 缩放 Memcached擅长于作为一个简单的键/值存储,并且擅长处理key=>STRING。这对于会话存储来说非常好 Redis擅长做key=>SOME\u对象 这真的取决于你要在里面放什么。我的理解是,就性能而言,它们相当均衡 如果您确实找到了一些客观的基准,也祝您好运,请发送给我。如果您
- 读/写速度
- 内存使用
- 磁盘I/O转储
- 缩放
如果您确实找到了一些客观的基准,也祝您好运,请发送给我。如果您不介意粗俗的写作风格,从可用性的角度来看,Systoilet博客上的内容值得一读,但在对性能做出任何结论之前,请务必阅读评论中的前后内容;存在一些方法上的问题(单线程繁忙循环测试),自本文撰写以来,Redis也做了一些改进 没有一个基准链接是完整的,它会让事情变得有点混乱,所以也可以在和中查看一些冲突的基准 编辑——正如安特里兹指出的那样,Systoilet分析的构思相当糟糕。即使在单线程不足的情况下,这些基准测试中的许多性能差异也可以归因于客户端库,而不是服务器吞吐量。do的基准确实提供了更多的苹果对苹果(用同样的嘴)的比较。Summary(TL;DR) 于2017年6月3日更新 Redis比memcached更强大、更受欢迎、支持更好。Memcached只能做Redis所能做的一小部分事情。即使在功能重叠的地方,Redis也更好 对于任何新内容,请使用Redis Memcached与Redis:直接比较 这两种工具都是功能强大、快速的内存数据存储,可作为缓存使用。两者都可以通过缓存数据库结果、HTML片段或任何其他生成成本可能较高的内容来帮助加快应用程序的速度 考虑要点 当用于同一事物时,以下是它们如何使用原始问题的“要考虑的要点”进行比较:
- 读/写速度:两者都非常快。基准测试因工作负载、版本和许多其他因素而异,但通常显示redis与memcached一样快或几乎一样快。我推荐redis,但不是因为memcached很慢。不是
- 内存使用:Redis更好。
- memcached:指定缓存大小,当您插入项时,守护进程会快速增长到略大于此大小。除了重新启动memcached,从来没有真正的方法可以回收这些空间。您的所有密钥都可能过期,您可以刷新数据库,但它仍将使用您配置的完整RAM块
- redis:设置最大尺寸取决于您。Redis永远不会使用过多的内存,并且会将不再使用的内存返回给您
- 我将100000~2KB的随机句子字符串(~200MB)存储到这两个数据库中。Memcached RAM的使用量增加到约225MB。Redis RAM的使用量增加到约228MB。在刷新了这两个内存之后,redis下降到约29MB,memcached保持在约225MB。它们在存储数据方面同样高效,但只有一个能够回收数据
- 磁盘I/O转储:redis显然获胜,因为它默认做到这一点,并且具有非常可配置的持久性。如果没有第三方工具,Memcached没有转储到磁盘的机制
- 扩展:在需要多个实例作为缓存之前,这两种方法都可以为您提供大量的空间。Redis提供了一些工具来帮助您超越这些,而memcached则没有
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");