【Rails】我试图用易懂的方式总结缓存
现金是什么?
在请求时保存数据,并在下次发生相同请求时重新利用保存的数据。
由于这样,就不再需要重新生成数据,从而提高性能。
使用缓存的地方不需要访问数据库并发出查询了。
1. 缓存的保存位置
在Rails的缓存功能中,有多个选项可用作缓存存储位置(缓存存储区)。
-
- 文件存储
-
- 内存存储
-
- 内存缓存
- Redis
除了其他一些选项以外,其中四个似乎最具代表性,一般使用Redis。
顺便提一下,在我的工作中,我使用一个叫做dalli的gem作为缓存存储的设置,将Memchache用作缓存存储。
在Rails应用程序中,可以进行以下配置。
config.cache_store = :dalli_store # :memory_store, :redis_cache_store など設定可能。
1. Rails缓存的类型
基于何种内容进行缓存?以下有三种选项。
-
- 页面缓存
-
- 操作缓存
- 片段缓存
在中文中,常用的方法是使用片段缓存来缓存视图逻辑的一部分。
这是默认可用的,无需添加任何 gem。
2. 什么是片段缓存?
以下是一种理解方式。
1. `cache` メソッドを使用。
2. 指定した引数から生成されるキーを元に、
3. ブロックに渡したビューのロジックをキャッシュする。
示例代码
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
这里是Rails指南的一个例子。
我们将一个名为product的对象作为键,并缓存了一个名为product的部分视图(有点复杂)。
3. 提醒事项
当たり前ではあるが、同一リクエスト内で同じキーを2回利用すると、意図しない挙動になってしまうので、ビュー内で一意である必要がある。
比如说这样的感觉。
app/views/products/index.html.erb 可以被改写为以下中文版本:
应用/视图/产品/索引.html.erb
<%#= bad %>
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
...
<% product = @products.first %>
<% cache product do %>
<%= render item %>
<% end %>
<%#= good %>
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
...
<% item = @items.first %>
<% cache item do %>
<%= render item %>
<% end %>
可能有些例子不太好理解。。
4. 参考链接
有很多篇文章以简单易懂的方式解释了清楚。
-
- Railsのキャッシュ機構 – Railsガイド
-
- Railsでクエリ結果をキャッシュしてDB負荷を軽減する – Qiita
Railsのキャッシュ(cache)について – Qiita
Railsのフラグメントキャッシュについて調べてみた – Qiita
Rails のキャッシュについて – Qiita
Railsアプリを66%スピードアップ ― Railsキャッシュの完全ガイド – POSTD