Tech Racho エンジニアの「?」を「!」に。
  • 開発

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ミドルウェアでパフォーマンスを改善(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。