我有机会在我工作过的缓存代理中同时使用memcached和redis,让我分享一下我在哪里使用了什么和背后相同的原因....
Redis>
1)用于通过群集索引缓存内容。我有超过十亿个密钥分布在redis集群上,redis响应时间非常少且稳定。
2)基本上,它是一个键/值存储,所以在你的应用程序中你有类似的东西,可以使用redis打扰很多。
3)Redis持久性,故障转移和备份(AOF)将使您的工作更轻松。
Memcache>
1)是的,可以用作缓存的优化内存。我用它来存储高速访问的缓存内容(50次点击/秒),大小小于1 MB。
2)当我的单个内容大小> 1MB时,我也只分配了16GB的2GB用于memcached。
3)当内容增长接近极限时,偶尔我会在统计数据中观察到更高的响应时间(不是redis的情况)。
如果您要求整体体验,Redis非常环保,因为它易于配置,具有稳定可靠的功能,非常灵活。
此外,还有一个基准测试结果 链接 ,下面是几个相同的高光,
希望这可以帮助!!
我们认为Redis是我们工作项目的负载起飞。我们认为通过在nginx中使用一个名为HttpRedis2Module的模块或类似的东西,我们会有很棒的速度,但是当用AB测试进行测试时,我们被证明是错误的。
也许模块很糟糕或我们的布局,但这是一个非常简单的任务,用PHP获取数据然后将其填充到MongoDB中甚至更快。我们使用APC作为缓存系统,使用php和MongoDB。它比nginx Redis模块快得多。
我的建议是自己测试一下,这样做会告诉你环境的结果。我们决定在我们的项目中使用Redis是没有必要的,因为它没有任何意义。
如果使用Redis
您需要有选择地删除/过期缓存中的项目。 (你需要这个)
您需要能够查询特定类型的键。 EQ。 'blog1:posts:*','blog2:categories:xyz:posts:*'。哦耶!这是非常重要的。使用此选项可以有选择地使某些类型的缓存项无效。您也可以使用它来使片段缓存,页面缓存,给定类型的AR对象等无效。
持久性(你也需要这个,除非你的缓存在每次重启后都必须预热。对于很少改变的对象非常重要)
使用memcached if
根据我的经验,我使用Redis比Memcached有更好的稳定性
另一个好处是,可以非常清楚memcache在缓存方案中的行为方式,而redis通常用作持久性数据存储区,但它可以配置为像memcached一样行为,即当它达到最大值时逐出最近使用过的项目容量。
我曾经使用过的一些应用程序只是为了明确我们打算如何处理数据 - 在memcache中,我们编写代码来处理不存在的情况 - redis中的东西,我们依赖它在那里。
除此之外,Redis通常被认为是大多数用例的优势,因为它更具功能,因此更具灵活性。
一个非常简单的测试,用于设置和获取针对redis-2.2.2和memcached的100k唯一键和值。两者都在Linux VM(CentOS)上运行,我的客户端代码(在下面粘贴)在Windows桌面上运行。
的 Redis的 强>
存储100000个值所需的时间是= 18954ms
加载100000个值所需的时间是= 18328ms
的 Memcached的 强>
存储100000个值所需的时间是= 797ms
检索100000个值所需的时间是= 38984ms
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可以做很多不同的事情,其中一个副作用是开发人员可能会开始在同一个实例上使用很多不同的功能集。如果您使用Redis的LRU功能来存储非LRU侧硬数据存储的缓存,则完全可能会耗尽内存。
如果您要将专用Redis实例设置为仅用作LRU实例以避免该特定情况,那么使用Redis而不是Memcached实际上没有任何令人信服的理由。
如果你需要一个可靠的“永不停机”的LRU缓存... Memcached将符合这个要求,因为它不可能通过设计耗尽内存,而specialize功能可以防止开发人员试图让它成为可能危及它的东西。简单分离关注点。
测试。运行一些简单的基准测试。很长一段时间以来,我认为自己是一个老学校的犀牛,因为我主要使用memcached并认为Redis是新的孩子。
我目前的公司Redis被用作主要缓存。当我挖掘一些性能统计数据并开始测试时,Redis在性能方面具有可比性或最低限度 的 慢点 强> 比MySQL。
Memcached虽然过于简单,却将Redis从水中吹走了 的 完全 强> 。它扩展得更好:
此外,memcached驱逐策略在我看来,实现得更好,导致整体平均响应时间更加稳定,同时处理的数据超过缓存可以处理的数据。
一些基准测试显示,在我们的案例中,Redis的表现非常糟糕。我认为这与许多变量有关:
就个人而言,我不同意Redis作者对并发和多线程的看法。
如果你对性能感兴趣,Memcached会更快,只是因为Redis涉及网络(TCP调用)。内部Memcache也更快。
Redis具有更多功能,正如其他答案所提到的那样。
如果我们说redis是(缓存+数据结构)的组合而memcached只是一个缓存,那就不错了。
Redis更好 Redis的优点是,
1.It has a lot of data storage options such as string , sets , sorted sets , hashes , bitmaps 2.Disk Persistence of records 3.Stored Procedure (LUA acripting) support 4.Can act as a Message Broker using PUB/SUB
而Memcache是内存中的键值缓存类型系统。
好吧,我主要使用我的应用程序,Memcache缓存会话和redis for doctrine / orm查询对象。 在性能方面,两者几乎相同。
这里没有指出的一个主要区别是Memcache始终有一个内存上限,而Redis默认不是(但可以配置为)。如果您总是希望在一定时间内存储键/值(并且由于内存不足而永远不会将其删除),那么您希望使用Redis。当然,你也冒着内存耗尽的风险......
Memcached是多线程和快速的。
Redis具有很多功能并且非常快,但完全限于一个核心,因为它基于事件循环。
我们两个都用。 Memcached用于缓存对象,主要是减少数据库的读取负载。 Redis用于排序集之类的东西,可以方便地汇总时间序列数据。