Rails 5.2: Redisキャッシュに複数エントリを一括保存する`write_multi`メソッド(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

タイトルは内容に即したものにしました。

Rails 5.2: Redisキャッシュに複数エントリを一括保存するwrite_multiメソッド(翻訳)

本記事はRails 5.2シリーズの記事です

Rails 5.2より前は、複数のエントリをキャッシュストアに書き込むことは不可能でした。RedisなどのキャッシュストアにMSETがあって1回のアトミックな操作で複数のキーを設定できるにもかかわらず、です。Railsのキャッシュ実装方法が原因で、Redisのこの機能を利用できませんでした。

RailsにActiveSupport::Cache::Storeという抽象クラスを用いたキャッシュが実装されました。これは、すべてのキャッシュストアが実装すべきインターフェイスを定義します。また、Railsはすべてのキャッシュストアクラスで必要な共通機能も提供します。

Rails 5.2より前のActiveSupport::Cache::Storeには、複数のエントリを一括で書き込むメソッドがありませんでした。

Rails 5.2からはwrite_multiメソッドが追加されました(#29366)。各キャッシュストアがこのメソッドを実装することで、複数エントリを一括で追加する機能を提供できます。デフォルトの実装は各key/valueペアをループしてwrite_entityメソッドで個別に設定します。

複数エントリの設定方法は次のとおりです。

Rails.cache.write_multi name: 'Alan Turning', country: 'England'

redis-railsは、Redisをキャッシュストアとして提供しますが、write_multiメソッドを実装していません。

しかしRails 5.2を使っていれば、write_multiメソッドを実装するRedisキャッシュストアをRailsが組み込みでサポートするのでredis-rails gemが不要になります(#31134で追加)。

以下の変更が必要です。

# before
config.cache_store = :redis_store

# after
config.cache_store = :redis_cache_store

redis-railsのリポジトリにあるissue #81には、このgemの開発が終了するというお知らせが掲載されていますので、今後はRails 5.2のRedisキャッシュストアを使うのがよいでしょう。

関連記事

RailsアプリでConcurrent Rubyを使う(翻訳)

Rails: RedisキャッシュとRackミドルウェアでパフォーマンスを改善(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ