rails7: 开启缓存 Rails.cache
常用的几种 rails cache
背景
我的项目中有常用的功能,如 settings/params/category 等数据,我希望通过 database 来管理,但我不想每次都走 sql,因为这样的性能会有问题。
配置
- development:
config/environments/development.rb
- 记得在
tmp/caching-dev.txt
创建文件,否则 development 环境并不会生效 - 直接用命令: touch tmp/caching-dev.txt 在 development 环境配合开启
- 下面的代码是开启内存级别的 cache
config.cache_store = :memory_store
- 记得在
- production
if Rails.root.join("tmp/caching-dev.txt").exist?
config.action_controller.perform_caching = true
config.action_controller.enable_fragment_cache_logging = true
config.cache_store = :memory_store
config.public_file_server.headers = {
"Cache-Control" => "public, max-age=#{2.days.to_i}"
}
存到 redis 里去
这个配置适合实际项目场景,另外 REDIS_URL 可以考虑配置到 .env 去,用
.dotenv-rails
去处理
config.cache_store = :redis_cache_store, { url: 'redis://4password7@localhost:6379/1' }
缓存的清除
- 如果没有清除,会导致更新数据库失败
class Category < ApplicationRecord
# ... 省略10000行代码
# update tree cache when update or create or destroy
after_commit :flush_cache
def self.tree
Rails.cache.fetch('category_tree') do
roots = Category.where(parent_id: nil).includes(:children)
roots.map { |root| build_category(root) }
end
end
def self.build_category(node)
{
id: node.id,
name: node.name,
children: node.children.map { |child| build_category(child) }
}
end
private
def flush_cache
Rails.cache.delete('category_tree')
end
end