カテゴリー: BackEnd

Railsの低レベルキャッシュを使ってみた

はじめに

こんにちは、tonnyです。
先日、APIにて外部からデータを取得する実装をしておりました。
このとき、同じようなデータを毎回毎回取得しに行くのもよくないと思い、簡易的ではありますが、Railsのキャッシュ機能を使用しました。

今回はそちらを備忘録的にまとめたいと思います。

環境

  • Ruby: 2.4.1
  • Ruby on Rails: 5.1.3

ドキュメント

概要については、こちらをご参照ください。
Railsのキャッシュ機能:概要

また、各メソッドについてはこちらを参照させていただきました。
今回はこの中からいくつかご紹介できれば、と思います。
ActiveSupport::Cache::Store < Object

準備

configの確認

今回は`rails console`にて確認していきます。
ただ、Development環境ではキャッシュ機能がオフになっております。
(正確には、キャッシュを取得しようとすると`null`が返るようになっています。)
こちらを修正します。

- config.cache_store = :null_store
+ # config.cache_store = :null_store

もしくはtmpcaching-dev.txtというファイルを作成すれば機能します。

Production環境はこの設定はありません。

キャッシュストア

デフォルトはメモリキャッシュになります。
(デフォルト値は32MBになります。)
ファイルキャッシュにすることもできるようです。
キャッシュストア

今回はデフォルトのまま進めます。

使ってみる

#read、#write、#delete

対象のキーを読み込み、書き込み、削除を行うメソッドです。
実際に使用した感じを記載します。

>> 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

対象のキーに値がセットされていなければ、値を書き込み、セットされていれば、その値を読み込みます。

>> Rails.cache.read("name")
=> nil
>> Rails.cache.fetch("name") do
?>   "tonny"
>> end
=> "tonny"
>> Rails.cache.read("name")
=> "tonny"

オプション

また、オプションもありますが、よく使うものというとexpires_inかと思います。
これは期限を設定します。
例えば、1時間を期限としたければ、下記のようになります。

>> Rails.cache.fetch("name", expires_in: 1.hours) do
?>   "tonny"
>> end
=> "tonny"

#read_multi、#fetch_multi

multiがつくと、複数のキーを配列で読み込むことができます。
また、もし値がセットされていなければ、read_multiであればセットされているキーだけ、fetch_multiであれば値がセットされます。

>> 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?

これは予想しやすいと思います。
そのキーが存在するかどうかです。

>> Rails.cache.delete("name")
=> true
>> Rails.cache.exist?("name")
=> false
>> Rails.cache.write("name", "tonny")
=> true
>> Rails.cache.exist?("name")
=> true

#clear

キャッシュを全て消すメソッドです。

>> Rails.cache.write("name", "tonny")
=> true
>> Rails.cache.clear
=> ["path/to/tmp/cache/1A2"]
>> Rails.cache.read("name")
=> nil

 

さいごに

簡単ではありますが、まとめてみました。

同じようなデータを取得する、計算する場合などに使用してみてはいかがでしょうか?

naoki85

コメントを見る

シェア
執筆者:
naoki85
タグ: Rails

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前