如何在heroku上使用两个不同的memcache实例

时间:2013-07-17 21:18:48

标签: ruby-on-rails caching heroku ruby-on-rails-3.2 memcached

我将数据库查询结果存储在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中

为什么不使用同一个:

因为有时我需要刷新整个缓存,这也会刷新我不想要的大数据。

有什么建议吗?

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(生存时间) - 因此它可以提供您想要的寿命有限的持久性。