【问题标题】:How to use two different memcache instances on heroku如何在 heroku 上使用两个不同的 memcache 实例
【发布时间】:2013-07-16 15:13:06
【问题描述】:

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

为什么不使用同一个:

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

有什么建议吗?

【问题讨论】:

  • 为什么不将大而罕见的变化作为静态资产提供服务?
  • 你看到上面的评论了吗?
  • @MichaelSzyndel 是的。但这些都是特定于用户的,每天我都会获得大约 400-500 个新用户,这就是他们的 fb 朋友列表等数据。检查接受的答案。

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


【解决方案1】:

我要做的是尝试从我正在缓存的东西中定义什么实际上是需要缓存的东西,或者它实际上需要一些寿命有限的持久性。

我会让 Rails 内部缓存系统去做它最擅长的事情:页面、动作和片段缓存,并使用另一个持久性引擎(例如 Redis)来保存和维护您谈到的那些大对象(实施这个建议是一个完全不同的问题)。

请注意,Redis 还允许在键上设置 TTL(生存时间) - 因此它可以提供您想要的这种有限寿命的持久性。

【讨论】:

    【解决方案2】:

    为您的 Heroku 应用声明三个新的 env 变量

    BIG_MEMCACHIER_SERVERS
    BIG_MEMCACHIER_USERNAME
    BIG_MEMCACHIER_PASSWORD
    

    config\initializers目录下添加一个名为big_cache.rb的文件:

    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(..)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 2018-04-14
      相关资源
      最近更新 更多