Redis和Memcache还是Redis?


85

我正在使用memcached通过简单的Rails.cache界面在Rails 3应用程序中进行一些缓存,现在我想使用redis和resque进行一些后台作业处理。

我认为它们的区别足以保证两者都使用。但是在heroku上,使用memcached和Redis需另外付费。两者都有意义还是应该迁移到仅使用Redis?

我喜欢使用memcached进行缓存,因为最近最少使用的键会自动从缓存中推出,并且我不需要缓存数据来持久化。Redis对我来说大多是新手,但我了解默认情况下它是持久性的,并且密钥不会自动过期。

编辑:只是想更清楚我的问题。我知道只使用Redis而不是两者都可行。我想我只是想知道这样做是否有任何特定的缺点?考虑到实现和基础架构,是否有任何原因导致我不应该只使用Redis?(即,对于简单的缓存而言,memcached更快吗?)我都没有找到任何确定的方法。


5
对于考虑此问题的其他人:有一个用于rails的redis-store插件,可让您将redis用作缓存存储。
markquezada

Answers:


49

假设从memcached迁移到redis进行缓存已经很容易了,那么我会使用redis只是为了保持简单。

在redis中,持久性是可选的,因此如果需要,您可以像memcached一样使用它。您甚至可能会发现,使高速缓存保持持久状态对于避免重启后大量高速缓存未命中很有用。到期也可用-该算法与memcached略有不同,但对于大多数用途而言并不重要-有关详细信息,请参见http://redis.io/commands/expire


1
感谢您的回答和相关文档。我对问题进行了一些编辑,以使其更加清楚我要寻找的内容。我没有考虑过重启后的缓存持久性……这是一个不错的功能。(尽管考虑到我将使用redis和heroku一起使用,我不确定它是否有用。)
markquezada 2010年

1
如果要在redis中保留一些临时性(片段缓存)项和一些持久性项,是否需要创建两个单独的redis实例?
Brian Armstrong

1
虽然我们将Redis用于两个作业队列和缓存,但出于@BrianArmstrong指出的特定原因,我们以不同的配置运行它们。高速缓存是临时的,因此我们可以对其进行快速配置,但是可以在内存中丢失内容并丢弃LRU是可以的。对于队列,我们​​确实不希望丢失工作,因此我们将其配置为持久性以使其可恢复。
jwadsa​​ck 2014年

@jwadsa​​ck您是否有帖子显示如何实现此配置?
Marklar

1
@Marklar好主意。我现在做的事:ballardhack.wordpress.com/2015/09/30/...
jwadsa​​ck

44

我是redis-store的作者,无需直接使用Redis命令,只需使用以下:expires_in选项:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

使用Redis的的优点是牢度好,我的宝石,是你已经拥有的商店Rack::CacheRails.cacheI18n


感谢卢卡的回复。我假设您需要持久存储某些内容时可以直接覆盖:expires_in吗?我想这个问题确实是关于同时使用memcached类型功能将redis用作持久存储。
markquezada 2011年

3
我认为将memcached和redis并置是没有意义的,因为它们位于同一NoSQL段中:两者都是ak / v存储。Redis PROS:1.比memcached更快2.更强大的命令3.不需要缓存预热4.对于解决其他问题(例如,带有Resque的队列)很有用CONS:1.您需要一个外部gem 2.重新启动后,服务器从追加文件Memcached PROS中读取数据时不接受命令:在Rails中烘焙CONS:1.比Redis慢2.缓存预热。
卡·吉迪

3
@LucaGuidi我目前正在将RedisStore用于我的Rails缓存。我不知道如何同时设置Redis URL默认URL :expires_in。你能帮我吗?
克里斯·文森特

像我一样,如果你正面临的问题设置:expires_in用redis_store参考stackoverflow.com/questions/20907247/...
AnirudhanĴ

19

我见过一些同时使用Memcached和Redis的大型Rails网站。Memcached用于短暂的事物,可以很好地保持内存中的热量,但是可以在需要时丢失/重新生成,而Redis用于持久性存储。两者都用于减轻主数据库的负担,以进行繁重的读/写操作。

更多细节:

Memcached:用于页面/片段/响应缓存,可以达到Memcached的内存限制,因为它会LRU(最近最少使用)使旧内容过期,并经常将访问的键保持在内存中。重要的是,如果需要,可以从数据库中重新创建Memcached中的任何内容(这不是您的唯一副本)。但是您可以继续将其转储到其中,Memcached会找出最常使用的内容,并将其保留在内存中。您不必担心从Memcached中删除内容。

redis:将其用于不希望丢失的数据,并且足够小以适合内存。这通常包括resque / sidekiq作业,用于速率限制的计数器,拆分测试结果或您不想丢失/重新创建的任何内容。您不想超出此处的内存限制,因此您在以后存储和清理内容时要多加注意。

一旦Redis超出内存限制,它就会开始出现性能问题(如果我输入错了,请纠正我)。可以通过配置Redis使其像Memcached和LRU过期内容来解决此问题,因此它永远不会达到其内存限制。但是,您不希望对Redis中保留的所有内容(例如,重做作业)执行此操作。因此,Rails.cache设置为使用Memcached(使用dalligem),而不是人们通常保留默认值。然后,它们保留一个单独的$ redis = ...全局变量来进行redis操作。

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

在Redis中可能有一种简单的方法来完成所有这些操作-也许有两个单独的Redis实例,一个实例具有与Memcache类似的LRU硬内存限制,而另一个实例用于持久存储?我还没有看到用过,但是我猜它是可行的。



6

我问了Redis Labs的团队(他们提供Memcached CloudRedis Cloud附加组件)关于他们推荐使用Rails缓存的产品的信息。他们表示总体上会推荐Redis Cloud,因为Memcached Cloud主要用于遗留目的,并指出他们的Memcached Cloud服务实际上是基于Redis Cloud的。


因此,既不需要Brian回答中提到的memcached和Redis吗?“人们通常将默认的Rails.cache设置为使用memcached(使用dalli gem)。然后,他们保留一个单独的$ redis = ...全局变量来进行redis操作。”
Marklar 2014年

4

我不知道您使用它们的目的是什么,但实际上同时使用它们可能会为您带来性能优势:Memcached在多个内核上运行的性能要比Redis好得多,因此使用Memcached缓存最重要的数据并将其余数据保留在Redis中,利用其作为数据库的功能,可以提高性能。


1
这不是完全正确的-Redis使用多个实例而不是多个线程,因此,将单核Redis实例与多核Memcached实例进行比较并不是特别相关的测试。此外,当有基准测试表明两个系统都最快时,在现实世界中差异并不大。
汤姆·克拉克森

Redis的多进程方法在多内核系统上的扩展性优于带多线程的memcached的(默认)方法:antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker,2010年

3
Redis的主要缺点确实被轻描淡写了。如果您正在寻找高并发性并且有很多核心,Memcached可以在Redis周围运行圈子。分片不是一个好的解决方案,因为您必须在应用程序中实现一致的哈希,而且Redis实例之间不会得到完美的分配。例如,如果分片A缓存了每个请求中使用的应用程序配置,则分片A会比不被每个请求击中的其他分片获得更多的请求。
ColinM 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.