【问题标题】:Where to put cache initializers in Rails?在 Rails 中的哪里放置缓存初始化器?
【发布时间】:2011-06-30 21:11:47
【问题描述】:

我正在尝试优化我的应用程序并在应用程序启动时将某些内容加载到 Rails 缓存(最终是 memcached)中。本质上,我的数据库中有一些表仅用于规范化目的并且很少更改。当它们发生变化时,我可以处理更新缓存的逻辑。

我应该在哪里编写“初始化程序”来读取这些不同的模型并将它们加载到缓存中?我尝试编写一个传统的初始化程序,但它在我的模型实际存在之前运行......我基本上需要加载我所有的模型和东西,然后创建缓存,然后运行应用程序。我怎样才能进入那个中间状态?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 caching activerecord


    【解决方案1】:

    我要么将此代码放在你的 lib 目录中的一个文件中,然后首先需要模型文件,要么直接放在你的模型文件中,以便在定义你的模型后运行初始化:

    class NormalizedTable
      ...
    end
    
    CacheInitializer.fill_cache_with :normalized_table
    

    其中 CacheInitializer#fill_cache_with 定义在您的初始化程序或 lib 目录中。我还建议您在后台运行这些功能,例如在延迟作业中。如果您在每次加载 Rails 应用程序时都运行此代码,它会减慢启动过程,并且数据可能没有必要一直在缓存中 - 即您的应用程序可以在缓存填充时使用数据库.

    【讨论】:

    • 我明白你关于使用delayed_job 的观点(我们已经将它用于其他东西),但实际上有5 条记录,此时几乎不值得使用delayed_job。不过我有点困惑......如果我在模型中初始化,它不会在我每次调用 Model.foo 或 @model.foo 时写入缓存吗?
    • 未生产。在开发中它会。我假设你会对此进行某种检查。如果您想在开发中使用缓存,那么您应该将此代码放在 autoload_once_paths 目录中,并确保首先包含您的模型。
    • 你可以像这样检查开发/生产:CacheInitializer.fill if Rails.env == 'production'
    • 我要投票,但至少要等几个小时,直到我标记为正确,因为这似乎是一个有点老套的解决方案。也许其他人会有更好的实现
    • 听起来不错。请记住,您总是可以简单地等待对信息的第一次 DB 调用,之后数据将进入您的缓存,您将不再有 DB 调用。由于它只是一个单一的 cal,因此可能值得让您的应用程序处理这个问题,而不是尝试预先填充缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2010-10-03
    • 2016-04-06
    • 2014-04-27
    相关资源
    最近更新 更多