SlideShare a Scribd company logo
Ruby on Rails の
キャッシュ機構について
2019/07/17
大手町.rb #19
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!
エンジニア積極採用中です
Ruby関西の中の人
2019年9月15日(日) 大阪RubyKaigi 02
発表者として登壇くださる方、あとで声かけください。
大手町.rb の中の人
毎月 大手町.rb の開催を予定
第2水曜か、第3水曜あたりで定期開催
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
今日のテーマ
Ruby on Rails のキャッシュ機構について
キャッシュはなぜ重要か
遅い処理はどうしてもたくさんある
入力が同じなら、出力も同じことが多い
単に、前回の値を覚えてそれを返せばいい!(=キャッシュ)
今日、話すこと
キャッシュの種類
Ruby on Rails が用意しているキャッシュストア
ENECHANGEでのキャッシュの利用について
2
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
キャッシュの種類
ページキャッシュ
ページ全体をキャッシュする
静的コンテンツのキャッシュ
ブラウザ・CDN・WEBサーバでキャッシュ
非常に高速に応答できる
フラグメントキャッシュ
view 部品のレンダリング結果をキャッシュ
低レベルキャッシュ
任意のクエリ結果、計算結果をキャッシュ
SQLキャッシュ
同一リクエスト内で、同一クエリを実行した
場合、キャッシュを返す
3
ブラウザ
CDN
WEBサーバ
(NGINX)
APサーバ
(puma等)
DBサーバ
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
ページキャッシュの利用
Ruby on Rails では静的コンテンツは下記を両立できる
リリース後すぐに反映される
キャッシュがすでにあればキャッシュを使う
Ruby on Rails のキャッシュの仕組み
アセットパイプラインで digest値つきのファイル名を生成
内容が変化すると digest(ファイル名)が変化する
Ruby on Rails で作られるコンテンツもページキャッシュ
を意識した設計にできる
4
# ページキャッシュが使うための設定
ttl = 1.hour
expires_in ttl, public: true, must_revalidate: true
request.session_options[:skip] = true # set-cookie を飛ばさない
@article = Article.last
fresh_when @article # fresh_when で ETAG をいいかんじに設定できる
must_revalidate: true
前回と同じコンテンツかの問い合わせ
を必須にする
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
(参考) ETAG とキャッシュの動作
ブラウザは ETAG と
組合せてページを
キャッシュする
リクエスト時に前回記憶し
た ETAG も合わせて送信
サーバは前回と同じ値なら
304 not modified を応答
ページ全体を返すよりも
ずっとコンパクトで
ネットワーク負荷が少ない
ブラウザだけでなく、
CDN やプロキシも同じよ
うに動作する
5
ブラウザ WEBサーバ
① / をリクエスト
② 200 OK をレスポンス
ETAG deadbeaf をブラウザはキャッシュ
③ / をリクエスト
前回の ETAG は deadbeaf
④ 304 not modified をレスポンス
ブラウザは前回のキャッシュを使う
⑤ / のコンテンツを更新
ETAG が beafbeaf になる
⑦ / をリクエスト
前回の ETAG は deadbeaf
⑧ 200 OK をレスポンス
ETAG beafbeaf をブラウザはキャッシュ
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
フラグメントキャッシュの利用 6
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
<%# ハッシュ値: views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901 %>
フラグメントキャッシュ
各部品ごとに個別に適切に期限切れを設定できる
下記の例では、 product の cache_key とテンプレート
ツリーダイジェストを元にキャッシュされる
cache_key : id と updated_at を元に生成したキー
テンプレートツリーダイジェスト: キャッシュされるビューフラ
グメントの内容から生成したハッシュ値
Ruby on Rails ではキーベースの有効期限を採用している
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
低レベルキャッシュ
低レベルキャッシュを使うと任意の処理結果をキャッシ
ュできる
Rails.cache.fetch
第1引数: キャッシュキー
expires_in: 有効期限
ブロック付きで呼び出す
キャッシュがなければ、ブロックの評価結果をキャッシュ
有効なキャッシュがあれば、キャッシュを返す
モデルで cache_key メソッドと組合わせて利用する
7
class Product < ApplicationRecord
def competing_price
Rails.cache.fetch("#{cache_key}/competing_price", expires_in: 12.hours) do
Competitor::API.find_price(id)
end
end
end
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
SQL キャッシュ
同一リクエスト内で同一のクエリを実行したとき、同一
の結果を返す
特別な設定なく、自動的に利用される
8
CACHE (0.0ms) SELECT "areas".* FROM "areas" WHERE "areas"."id" = 1
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
キャッシュストア
単一サーバなら FileStore、
複数サーバなら RedisCacheStoreがオススメ
ActiveSupport::Cache::MemoryStore
各Rubyプロセス内に持つキャッシュストア
プロセス間でキャッシュを共有できる
ActiveSupport::Cache::FileStore
ディスクシステム上のファイルにキャッシュする
プロセス間でキャッシュ共有できる
ActiveSupport::Cache::MemCacheStore
memcached を使うキャッシュ
ActiveSupport::Cache::RedisCacheStore
Redis を使うキャッシュ
9
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
(おまけ) RequestStore
https://github.com/steveklabnik/request_store
同一リクエスト内が存続期間
キャッシュストアというか
同一リクエスト内でだけ使えるグローバル変数
Model と Controller とかでデータ共有したいときとかに便利
もちろん、キャッシュストアとしても使える
容量・用法は適切に
10
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
ENECHANGE でのキャッシュ
ページキャッシュを積極的に活用
静的アセットはアセットパイプラインを使って生成
Nginx で、digest があれば永遠にキャッシュされるように設定
一部の静的なページはページキャッシュを利用
低レベルキャッシュ(Rails.cache.fetch)を Model で利用
キャンペーン情報等は日単位で切り替わることが多い
ENECHANGE ではキャッシュキーに年月日を含めている
日付が変わると、自動的に取得しなおす
キャッシュが切り替わる条件はすべてキャッシュキーに含めるのが
ベストプラクティス
RedisCacheStore と RequestStore を組み合わせて利用
Redis サーバはネットワーク的に別のサーバにあり、ちょっと遠い
一部のキャッシュしている値がとても大きい(数MBある)
Redis への取得結果を RequestStore にキャッシュ
同一リクエスト内で同じ値を Redisサーバまで取りに行かせない
11
大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」
まとめ
いろんなタイミングでキャッシュできる
ページキャッシュ、低レベルキャッシュ
キャッシュ機構もいろいろある
ファイルキャッシュ、MemCached、Redis ・・・
ENECHANGE では低レベルキャッシュを多用
DB からの取得結果をキャッシュ
キャッシュヒット率を高める
RequestStore も一部利用している
12
ご清聴ありがとう
ございました

More Related Content

What's hot

[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
 
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
yoku0825
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
土岐 孝平
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
Naoya Nakazawa
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service Overview
Takeshi Fukuhara
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
SQLチューニング勉強会資料
SQLチューニング勉強会資料SQLチューニング勉強会資料
SQLチューニング勉強会資料
Shinnosuke Akita
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
 
組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends
PIXTA Inc.
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTT DATA Technology & Innovation
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
ota42y
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-
[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-
[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-Amazon Web Services Japan
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 

What's hot (20)

[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service Overview
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
SQLチューニング勉強会資料
SQLチューニング勉強会資料SQLチューニング勉強会資料
SQLチューニング勉強会資料
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-
[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-
[AWSマイスターシリーズ] AWS Elastic Beanstalk -Python編-
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 

Similar to Ruby on Rails のキャッシュ機構について

Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
Tomoya Kawanishi
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Tomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
Tomoya Kawanishi
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRuby
Tomoya Kawanishi
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
Tomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
Tomoya Kawanishi
 
Rails あるある
Rails あるあるRails あるある
Rails あるある
Ryunosuke SATO
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
Tomoya Kawanishi
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
Tomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
Tomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
Tomoya Kawanishi
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
Tomoya Kawanishi
 
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
Yasuko Ohba
 
Long Life RailsApp in the case of REJOB
Long Life RailsApp in the case of REJOBLong Life RailsApp in the case of REJOB
Long Life RailsApp in the case of REJOB
Daisuke Yamasaki
 
Ruby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LTRuby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LT
NISHIMOTO Keisuke
 
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
kotaro_hirayama
 
RubyKaja 2013
RubyKaja 2013RubyKaja 2013
RubyKaja 2013
Takeshi Yabe
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
Koichi Shimozono
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
Tomoya Kawanishi
 

Similar to Ruby on Rails のキャッシュ機構について (20)

Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRuby
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Rails あるある
Rails あるあるRails あるある
Rails あるある
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
 
Long Life RailsApp in the case of REJOB
Long Life RailsApp in the case of REJOBLong Life RailsApp in the case of REJOB
Long Life RailsApp in the case of REJOB
 
Ruby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LTRuby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LT
 
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
 
RubyKaja 2013
RubyKaja 2013RubyKaja 2013
RubyKaja 2013
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 

More from Tomoya Kawanishi

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
Tomoya Kawanishi
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
Tomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
Tomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
Tomoya Kawanishi
 
Rake
RakeRake
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
Tomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
Tomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Tomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
Tomoya Kawanishi
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例について
Tomoya Kawanishi
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
Tomoya Kawanishi
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
Tomoya Kawanishi
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
Tomoya Kawanishi
 
Tsort について
Tsort についてTsort について
Tsort について
Tomoya Kawanishi
 
ガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue js
Tomoya Kawanishi
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
Tomoya Kawanishi
 

More from Tomoya Kawanishi (17)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Rake
RakeRake
Rake
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例について
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
 
Tsort について
Tsort についてTsort について
Tsort について
 
ガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue js
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 

Recently uploaded

論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
atsushi061452
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 

Recently uploaded (15)

論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 

Ruby on Rails のキャッシュ機構について

  • 1. Ruby on Rails の キャッシュ機構について 2019/07/17 大手町.rb #19
  • 2. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! エンジニア積極採用中です Ruby関西の中の人 2019年9月15日(日) 大阪RubyKaigi 02 発表者として登壇くださる方、あとで声かけください。 大手町.rb の中の人 毎月 大手町.rb の開催を予定 第2水曜か、第3水曜あたりで定期開催 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  • 3. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 今日のテーマ Ruby on Rails のキャッシュ機構について キャッシュはなぜ重要か 遅い処理はどうしてもたくさんある 入力が同じなら、出力も同じことが多い 単に、前回の値を覚えてそれを返せばいい!(=キャッシュ) 今日、話すこと キャッシュの種類 Ruby on Rails が用意しているキャッシュストア ENECHANGEでのキャッシュの利用について 2
  • 4. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 キャッシュの種類 ページキャッシュ ページ全体をキャッシュする 静的コンテンツのキャッシュ ブラウザ・CDN・WEBサーバでキャッシュ 非常に高速に応答できる フラグメントキャッシュ view 部品のレンダリング結果をキャッシュ 低レベルキャッシュ 任意のクエリ結果、計算結果をキャッシュ SQLキャッシュ 同一リクエスト内で、同一クエリを実行した 場合、キャッシュを返す 3 ブラウザ CDN WEBサーバ (NGINX) APサーバ (puma等) DBサーバ
  • 5. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 ページキャッシュの利用 Ruby on Rails では静的コンテンツは下記を両立できる リリース後すぐに反映される キャッシュがすでにあればキャッシュを使う Ruby on Rails のキャッシュの仕組み アセットパイプラインで digest値つきのファイル名を生成 内容が変化すると digest(ファイル名)が変化する Ruby on Rails で作られるコンテンツもページキャッシュ を意識した設計にできる 4 # ページキャッシュが使うための設定 ttl = 1.hour expires_in ttl, public: true, must_revalidate: true request.session_options[:skip] = true # set-cookie を飛ばさない @article = Article.last fresh_when @article # fresh_when で ETAG をいいかんじに設定できる must_revalidate: true 前回と同じコンテンツかの問い合わせ を必須にする
  • 6. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 (参考) ETAG とキャッシュの動作 ブラウザは ETAG と 組合せてページを キャッシュする リクエスト時に前回記憶し た ETAG も合わせて送信 サーバは前回と同じ値なら 304 not modified を応答 ページ全体を返すよりも ずっとコンパクトで ネットワーク負荷が少ない ブラウザだけでなく、 CDN やプロキシも同じよ うに動作する 5 ブラウザ WEBサーバ ① / をリクエスト ② 200 OK をレスポンス ETAG deadbeaf をブラウザはキャッシュ ③ / をリクエスト 前回の ETAG は deadbeaf ④ 304 not modified をレスポンス ブラウザは前回のキャッシュを使う ⑤ / のコンテンツを更新 ETAG が beafbeaf になる ⑦ / をリクエスト 前回の ETAG は deadbeaf ⑧ 200 OK をレスポンス ETAG beafbeaf をブラウザはキャッシュ
  • 7. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 フラグメントキャッシュの利用 6 <% @products.each do |product| %> <% cache product do %> <%= render product %> <% end %> <% end %> <%# ハッシュ値: views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901 %> フラグメントキャッシュ 各部品ごとに個別に適切に期限切れを設定できる 下記の例では、 product の cache_key とテンプレート ツリーダイジェストを元にキャッシュされる cache_key : id と updated_at を元に生成したキー テンプレートツリーダイジェスト: キャッシュされるビューフラ グメントの内容から生成したハッシュ値 Ruby on Rails ではキーベースの有効期限を採用している
  • 8. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 低レベルキャッシュ 低レベルキャッシュを使うと任意の処理結果をキャッシ ュできる Rails.cache.fetch 第1引数: キャッシュキー expires_in: 有効期限 ブロック付きで呼び出す キャッシュがなければ、ブロックの評価結果をキャッシュ 有効なキャッシュがあれば、キャッシュを返す モデルで cache_key メソッドと組合わせて利用する 7 class Product < ApplicationRecord def competing_price Rails.cache.fetch("#{cache_key}/competing_price", expires_in: 12.hours) do Competitor::API.find_price(id) end end end
  • 9. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 SQL キャッシュ 同一リクエスト内で同一のクエリを実行したとき、同一 の結果を返す 特別な設定なく、自動的に利用される 8 CACHE (0.0ms) SELECT "areas".* FROM "areas" WHERE "areas"."id" = 1
  • 10. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 キャッシュストア 単一サーバなら FileStore、 複数サーバなら RedisCacheStoreがオススメ ActiveSupport::Cache::MemoryStore 各Rubyプロセス内に持つキャッシュストア プロセス間でキャッシュを共有できる ActiveSupport::Cache::FileStore ディスクシステム上のファイルにキャッシュする プロセス間でキャッシュ共有できる ActiveSupport::Cache::MemCacheStore memcached を使うキャッシュ ActiveSupport::Cache::RedisCacheStore Redis を使うキャッシュ 9
  • 11. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 (おまけ) RequestStore https://github.com/steveklabnik/request_store 同一リクエスト内が存続期間 キャッシュストアというか 同一リクエスト内でだけ使えるグローバル変数 Model と Controller とかでデータ共有したいときとかに便利 もちろん、キャッシュストアとしても使える 容量・用法は適切に 10
  • 12. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 ENECHANGE でのキャッシュ ページキャッシュを積極的に活用 静的アセットはアセットパイプラインを使って生成 Nginx で、digest があれば永遠にキャッシュされるように設定 一部の静的なページはページキャッシュを利用 低レベルキャッシュ(Rails.cache.fetch)を Model で利用 キャンペーン情報等は日単位で切り替わることが多い ENECHANGE ではキャッシュキーに年月日を含めている 日付が変わると、自動的に取得しなおす キャッシュが切り替わる条件はすべてキャッシュキーに含めるのが ベストプラクティス RedisCacheStore と RequestStore を組み合わせて利用 Redis サーバはネットワーク的に別のサーバにあり、ちょっと遠い 一部のキャッシュしている値がとても大きい(数MBある) Redis への取得結果を RequestStore にキャッシュ 同一リクエスト内で同じ値を Redisサーバまで取りに行かせない 11
  • 13. 大手町.rb #19 「Ruby on Rails の持つキャッシュ機構について」 まとめ いろんなタイミングでキャッシュできる ページキャッシュ、低レベルキャッシュ キャッシュ機構もいろいろある ファイルキャッシュ、MemCached、Redis ・・・ ENECHANGE では低レベルキャッシュを多用 DB からの取得結果をキャッシュ キャッシュヒット率を高める RequestStore も一部利用している 12