概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Rails 5.2 added method write_multi to cache store | BigBinary Blog
- 原文公開日: 2018/07/03
- 著者: Rohan Pujari
- サイト: BigBinary
タイトルは内容に即したものにしました。
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キャッシュストアを使うのがよいでしょう。