我通过简单的Rails.cache
界面在我的Rails 3应用程序中使用memcached进行缓存,现在我想用redis和resque做一些后台作业处理.
我认为它们的不同足以保证同时使用它们.但是在heroku上,使用memcached和redis都有单独的费用.使用两者是否有意义,或者我应该迁移到只使用redis?
我喜欢使用memcached进行缓存,因为最近最少使用的密钥会自动从缓存中推出,而我不需要缓存数据.Redis对我来说几乎是新手,但我知道默认情况下它是持久的,并且密钥不会自动从缓存中过期.
编辑:只是想更清楚我的问题.我知道只使用Redis而不是两者都是可行的.我想我只是想知道这样做有什么特别的缺点吗?考虑到实现和基础设施,我不应该只使用Redis吗?(即,对于简单的缓存,memcached更快?)我没有找到任何确定的方法.
假设从memcached迁移到redis用于缓存已经很容易,我只使用redis来保持简单.
在redis中,持久性是可选的,所以你可以像memcached一样使用它,如果这是你想要的.您甚至可能会发现使缓存持久化有助于避免重启后出现大量缓存未命中.也可以使用到期 - 算法与memcached略有不同,但对于大多数用途来说还不够重要 - 有关详细信息,请参阅http://redis.io/commands/expire.
我是redis-store的作者,没有必要直接使用Redis命令,只需使用如下:expires_in
选项:
ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
使用Redis的优点是坚固性,而且我的宝石就是你已经拥有商店Rack::Cache
,Rails.cache
或者I18n
.
我见过一些使用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,另一个用于持久存储?我没有看到这个用过,但我猜它会是可行的.
我会考虑查看我对这个问题的答案:
Rails和缓存,在memcache和redis之间切换是否容易?
从本质上讲,根据我的经验,我主张将它们分开:memcached用于缓存和redis用于数据结构和更持久的存储
我向Redis Labs的团队(提供Memcached Cloud和Redis Cloud添加)询问了他们为Rails缓存推荐哪种产品.他们说,一般来说,他们会推荐Redis Cloud,Memcached Cloud主要用于传统目的,并指出他们的Memcached Cloud服务实际上是建立在Redis Cloud之上的.