我将数据库查询结果存储在heroku上的memcache中。我在heroku上使用memcachier插件。例如,如果我在memcache中有缓存用户的任务。我做这样的事情:
def cached_tasks
Rails.cache.fetch([:users, id, :tasks], :expires_in => 12.hours) { tasks.to_a }
end
这完全正常,但我想使用两个不同的memcache实例来存储数据。
为什么吗
经常使用的一种,基本上数据经常变化,而另一种是大数据对象,而且永远不会改变或很少。
如何使用两个不同的实例并指定cached_tasks应存储在memcache_instance_1中,其他类似cached_images应存储在memcache_instance_2中
为什么不使用同一个:
因为有时我需要刷新整个缓存,这也会刷新我不想要的大数据。
有什么建议吗?
答案 0 :(得分:3)
为您的heroku应用宣布三个新的env
变量
BIG_MEMCACHIER_SERVERS
BIG_MEMCACHIER_USERNAME
BIG_MEMCACHIER_PASSWORD
在big_cache.rb
目录中添加名为config\initializers
的文件:
module Rails
def self.big_cache
@big_cache ||= ActiveSupport::Cache::DalliStore.new(
(ENV["BIG_MEMCACHIER_SERVERS"] || "").split(","),
:username => ENV["BIG_MEMCACHIER_USERNAME"],
:password => ENV["BIG_MEMCACHIER_PASSWORD"])
end
end
现在您可以按如下方式访问第二个缓存:
Rails.big_cache.fetch(..)
答案 1 :(得分:0)
我要做的是尝试定义我正在缓存的东西实际上需要缓存的东西,或者它实际上需要一些生命有限的持久性。
我会让Rails内部缓存系统做它最擅长的事情:页面,动作和片段缓存,并使用另一个持久性引擎(如Redis)来保存和维护你谈到的那些大对象(实现这个建议)是一个完全不同的问题。)
请注意,Redis还允许在键上设置TTL(生存时间) - 因此它可以提供您想要的寿命有限的持久性。