在Rails中,缓存初始化器应该放在哪里?

4
我正在尝试优化我的应用程序,并在应用程序启动时将某些内容加载到Rails缓存(最终是memcached)中。基本上,我有几个表在我的数据库中仅存在于规范化目的,并且很少更改。当它们发生变化时,我可以处理更新缓存的逻辑。
我应该在哪里编写“初始化程序”以读取这些不同的模型并将它们加载到缓存中?我尝试编写传统的初始化程序,但它在我的模型实际存在之前运行...我基本上需要加载所有的模型和内容,然后创建缓存,然后运行应用程序。如何进入那个中间状态?
1个回答

1
我建议将这段代码放在您的lib目录下的文件中,并首先要求模型文件,或直接放在您的模型文件中,以便初始化在定义模型之后运行:
class NormalizedTable
  ...
end

CacheInitializer.fill_cache_with :normalized_table

CacheInitializer#fill_cache_with 函数定义在你的 initializers 或 lib 目录中。我建议你将这些函数在后台运行,例如使用延迟任务。如果每次加载 Rails 应用程序时都运行此代码,它会减慢启动过程,并且可能并不需要始终将数据存储在缓存中 - 也就是说,在填充缓存时,你的应用程序可以使用数据库。


我理解你关于使用delayed_job的观点(我们已经在用它处理其他事情),但实际上只有大约5条记录,目前使用delayed_job几乎不值得。不过我有点困惑...如果我在模型中初始化,那么每次调用Model.foo或@model.foo时,它不会每次都写入缓存吗? - sethvargo
不在生产环境中。在开发环境中会这样做。我假设你会有某种检查来处理这个问题。如果你想在开发中使用缓存,那么你应该将这段代码放在autoload_once_paths目录中,并确保你首先包含你的模型。 - Pan Thomakos
你可以像这样检查开发/生产环境:如果Rails.env == 'production',则执行CacheInitializer.fill。 - Pan Thomakos
我会点赞,但我至少会等几个小时才标记为正确,因为这似乎是一个有些繁琐的解决方案。也许其他人会有更好的实现。 - sethvargo
听起来不错。请记住,您始终可以等待第一次对信息的数据库调用,之后数据将进入缓存,您就不需要再进行数据库调用了。由于只涉及单个调用,让您的应用程序自行处理这一点可能是值得的,而无需尝试预填充缓存。 - Pan Thomakos
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接