rails7: 开启缓存 Rails.cache

常用的几种 rails cache
更新于: 2023-12-06 08:46:50

背景

我的项目中有常用的功能,如 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