Caching Strategies for Rails 8 是一套针对 Rails 8 应用的缓存实现指南,目标是帮助开发者通过多层级缓存进行性能优化。资料说明其适用场景为:添加片段缓存、俄罗斯套娃缓存、低层缓存、缓存失效等。
一、缓存层级概览 Rails 提供多个缓存层:片段缓存用于缓存视图 partial;俄罗斯套娃缓存用于嵌套缓存片段;低层缓存用于缓存任意数据;HTTP 缓存用于浏览器和 CDN 缓存;查询缓存则在请求内自动生效。
二、快速开始 在 config/environments/development.rb 中设置: config.action_controller.perform_caching = true config.cache_store = :memory_store
在 config/environments/production.rb 中设置: config.cache_store = :solid_cache_store # Rails 8 default 或 config.cache_store = :redis_cache_store, { url: ENV["REDIS_URL"] }
在开发环境启用缓存可执行: bin/rails dev:cache
三、缓存存储选项 资料给出对比表:
- :memory_store:用于开发,优点是快、无需设置;缺点是不共享、大小受限。
- :solid_cache_store:用于生产(Rails 8),优点是数据库支持、无需 Redis;缺点是略慢。
- :redis_cache_store:用于生产,优点是快、可共享;缺点是需要 Redis。
- :file_store:用于简单生产环境,优点是持久、无需 Redis;缺点是慢、不共享。
- :null_store:用于测试,不缓存,无优缺点。
四、片段缓存 基础写法示例(app/views/events/_event.html.erb): <% cache event do %> <article class="event-card"> <h3><%= event.name %></h3> <p><%= event.description %></p> <time><%= l(event.event_date, format: :long) %></time> <%= render event.venue %> </article> <% end %>
缓存键组成:Rails 从模型名、模型 ID、updated_at 时间戳、模板摘要(自动)生成缓存键。资料给出的生成键示例为: views/events/123-20240115120000000000/abc123digest
自定义缓存键示例: <% cache [event, "v2"] do %> <% cache [event, current_user] do %> <% cache "featured-events-#{Date.current}" do %>
五、俄罗斯套娃缓存 嵌套缓存,当外层缓存失效时内层缓存可被复用。示例中在 app/views/events/show.html.erb 里缓存 @event,并在内部循环中分别缓存 vendor 和 comment。资料提示在 belongs_to 关联上使用 touch: true 可以将失效向上级联,具体示例见 cache-invalidation.md。
六、集合缓存 高效集合渲染写法: <%= render partial: "events/event", collection: @events, cached: true %> 带自定义缓存键: <%= render partial: "events/event", collection: @events, cached: ->(event) { [event, current_user.admin?] } %>
七、低层缓存 使用 Rails.cache.fetch 配合块是最常见模式。low-level-caching.md 涵盖:基本 read/write/fetch 示例、在服务对象中缓存、在查询对象中缓存、实例变量记忆化、使用 CurrentAttributes 进行请求作用域记忆化。
八、缓存失效 三种策略:基于时间的过期、基于键的过期(使用 updated_at)、手动删除。cache-invalidation.md 涵盖:基于时间和基于键的过期、模型回调和服 务中的手动失效、基于模式的删除(delete_matched)、用于俄罗斯套娃级联的 touch: true、内置和自定义计数器缓存。
九、HTTP 缓存 使用 stale? 实现条件 GET(ETags/Last-Modified),使用 expires_in 设置 Cache-Control 头。完整示例见 http-caching-and-testing.md。
十、测试缓存 使用 :caching 元数据标签在 spec 中启用缓存。http-caching-and-testing.md 涵盖:rails_helper.rb 配置、测试缓存视图失效、测试服务中的缓存失效、性能监控与插桩。
十一、检查清单
- 为环境配置缓存存储
- 对昂贵 partial 使用片段缓存
- 为俄罗斯套娃在 belongs_to 上使用 touch: true
- 使用 cached: true 进行集合缓存
- 对昂贵查询使用低层缓存
- 定义缓存失效策略
- 为计数使用计数器缓存
- 为 API 设置 HTTP 缓存头
- 如有需要,为冷启动进行缓存预热
- 监控命中/未命中率
十二、参考资料 low-level-caching.md:fetch/read/write、服务对象、查询对象、记忆化 cache-invalidation.md:过期策略、手动失效、touch、计数器缓存 http-caching-and-testing.md:ETags、Cache-Control、spec 配置、监控
除上述内容外,资料未提供其他功能、收费、价格、平台、效果或使用步骤信息。