はじめに
こんにちは、tonnyです。
先日、APIにて外部からデータを取得する実装をしておりました。
このとき、同じようなデータを毎回毎回取得しに行くのもよくないと思い、簡易的ではありますが、Railsのキャッシュ機能を使用しました。
今回はそちらを備忘録的にまとめたいと思います。
環境
- Ruby: 2.4.1
- Ruby on Rails: 5.1.3
ドキュメント
概要については、こちらをご参照ください。
Railsのキャッシュ機能:概要
また、各メソッドについてはこちらを参照させていただきました。
今回はこの中からいくつかご紹介できれば、と思います。
ActiveSupport::Cache::Store < Object
準備
configの確認
今回は
rails console
にて確認していきます。
ただ、Development環境ではキャッシュ機能がオフになっております。
(正確には、キャッシュを取得しようとすると
null
が返るようになっています。)
こちらを修正します。
1 2 | - config.cache_store = :null_store + # config.cache_store = :null_store |
もしくは
tmp
に
caching-dev.txt
というファイルを作成すれば機能します。
Production環境はこの設定はありません。
キャッシュストア
デフォルトはメモリキャッシュになります。
(デフォルト値は32MBになります。)
ファイルキャッシュにすることもできるようです。
キャッシュストア
今回はデフォルトのまま進めます。
使ってみる
#read、#write、#delete
対象のキーを読み込み、書き込み、削除を行うメソッドです。
実際に使用した感じを記載します。
1 2 3 4 5 6 7 8 9 10 | >> Rails.cache.read("name") => nil >> Rails.cache.write("name", "tonny") => true >> Rails.cache.read("name") => "tonny" >> Rails.cache.delete("name") => true >> Rails.cache.read("name") => nil |
こちらは基本となりますが、次の方が使いやすいのではないでしょうか?
#fetch
対象のキーに値がセットされていなければ、値を書き込み、セットされていれば、その値を読み込みます。
1 2 3 4 5 6 7 8 | >> Rails.cache.read("name") => nil >> Rails.cache.fetch("name") do ?> "tonny" >> end => "tonny" >> Rails.cache.read("name") => "tonny" |
オプション
また、オプションもありますが、よく使うものというと
expires_in
かと思います。
これは期限を設定します。
例えば、1時間を期限としたければ、下記のようになります。
1 2 3 4 | >> Rails.cache.fetch("name", expires_in: 1.hours) do ?> "tonny" >> end => "tonny" |
#read_multi、#fetch_multi
multi
がつくと、複数のキーを配列で読み込むことができます。
また、もし値がセットされていなければ、
read_multi
であればセットされているキーだけ、
fetch_multi
であれば値がセットされます。
1 2 3 4 5 6 7 8 | >> Rails.cache.write("name", "tonny") => true >> Rails.cache.read_multi("name", "lang") => {"name"=>"tonny"} >> Rails.cache.fetch_multi("name", "lang") do ?> "hogehoge" >> end => {"name"=>"tonny", "lang"=>"hogehoge"} |
#exist?
これは予想しやすいと思います。
そのキーが存在するかどうかです。
1 2 3 4 5 6 7 8 | >> Rails.cache.delete("name") => true >> Rails.cache.exist?("name") => false >> Rails.cache.write("name", "tonny") => true >> Rails.cache.exist?("name") => true |
#clear
キャッシュを全て消すメソッドです。
1 2 3 4 5 6 | >> Rails.cache.write("name", "tonny") => true >> Rails.cache.clear => ["path/to/tmp/cache/1A2"] >> Rails.cache.read("name") => nil |
さいごに
簡単ではありますが、まとめてみました。
同じようなデータを取得する、計算する場合などに使用してみてはいかがでしょうか?
expired_in:
は無くて
expires_in:
https://railsguides.jp/caching_with_rails.html#activesupport-cache-store
ご指摘ありがとうございます。
ご指摘のとおり、expires_in: が正しいものになります。
本文も修正させていただきました!