我通过简单的Rails.cache
界面在我的Rails 3应用程序中使用memcached进行缓存,现在我想用redis和resque做一些后台作业处理。
我认为它们的不同足以保证同时使用它们。但是在heroku上,使用memcached和redis都有单独的费用。使用两者是否有意义,或者我应该只使用redis迁移?
我喜欢使用memcached进行缓存,因为最近最少使用的密钥会自动从缓存中推出,而我不需要缓存数据。 Redis对我来说几乎是新手,但据我所知,默认情况下它是持久的,并且密钥不会自动从缓存中过期。
编辑:只是想更清楚我的问题。我知道只使用Redis而不是两者都是可行的。我想我只是想知道这样做有什么特别的缺点吗?考虑到实现和基础设施,我不应该只使用Redis吗? (即,对于简单的缓存,memcached更快?)我没有找到任何确定的方法。答案 0 :(得分:48)
假设从memcached迁移到redis用于缓存已经很容易,我只使用redis来保持简单。
在redis中,持久性是可选的,所以你可以像memcached一样使用它,如果这是你想要的。您甚至可能会发现使缓存持久化有助于避免重启后出现大量缓存未命中。也可以使用到期 - 该算法与memcached略有不同,但对于大多数用途而言还不够重要 - 有关详细信息,请参阅http://redis.io/commands/expire。
答案 1 :(得分:44)
我是redis-store的作者,没有必要直接使用Redis命令,只需使用:expires_in
选项,如下所示:
ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
使用Redis的优势在于坚固性,而且对于我的宝石,您已经拥有Rack::Cache
,Rails.cache
或I18n
的商店。
答案 2 :(得分:19)
我见过一些使用Memcached和Redis的大型rails网站。 Memcached用于短暂的事情,这些事情很好,可以在内存中保持热量,但如果需要可以丢失/重新生成,Redis用于持久存储。两者都用于从主DB上卸载以进行读/写重操作。
更多详情:
Memcached:用于页面/片段/响应缓存,可以在Memcached上达到内存限制,因为LRU(最近最少使用)会使旧内容过期,并且经常保持访问密钥内存热。重要的是,如果需要,可以从数据库中重新创建Memcached中的任何内容(它不是您唯一的副本)。但是你可以继续将内容转储到其中,Memcached将会确定最常用的内容,并将这些内容保存在内存中。您不必担心从Memcached中删除内容。
redis:您将此用于您不想丢失的数据,并且足够小以适应内存。这通常包括resque / sidekiq作业,速率限制计数器,拆分测试结果或任何您不想丢失/重新创建的内容。您不希望超出此处的内存限制,因此您必须对以后存储和清理的内容稍微小心。
一旦超过内存限制,Redis就会遇到性能问题(如果我错了,请纠正我)。可以通过将Redis配置为像Memcached和LRU过期的东西来解决这个问题,因此它永远不会达到其内存限制。但是你不想用你在Redis中保留的所有东西来做这件事,比如resque工作。因此,Rails.cache设置为使用Memcached(使用dalli
gem),而不是人们经常保持默认值。然后他们保留一个单独的$ 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实例,一个具有LRU硬内存限制,类似于Memcache,另一个用于持久存储?我没有看到这个用过,但我猜它会是可行的。
答案 3 :(得分:15)
我会考虑查看关于这个主题的答案:
Rails and caching, is it easy to switch between memcache and redis?
基本上,根据我的经验,我主张将它们分开:memcached用于缓存和redis用于数据结构和更持久的存储
答案 4 :(得分:6)
我在Redis Labs(提供Memcached Cloud和Redis Cloud添加内容)的小组询问了他们建议哪些产品用于Rails缓存。他们说,一般来说,他们会推荐Redis Cloud,Memcached Cloud主要用于传统目的,并指出他们的Memcached Cloud服务实际上建立在Redis Cloud之上。
答案 5 :(得分:4)
我不知道你使用它们是什么,但实际使用它们可能会给你带来性能优势:Memcached在多个内核上运行的性能远远超过Redis,因此使用Memcached缓存最重要的数据并保持在Redis中休息,利用其作为数据库的功能,可以提高性能。