Help us understand the problem. What is going on with this article?

【Redis】”SCAN”による安全なKey取得を Rails で実装する

この記事ではSCANによるKey取得をRailsで実装する例」を紹介します。

Key取得の方法にはKEYSSCANがありますが、「サーバ稼働の安全性」を考慮するとKey取得にはSCANを使うことが推奨されています。詳しくは先日僕が投稿した「【Redis】KEYSによるKey取得の危険性とSCANによる安全な対処」をご覧ください。

SCANでのKeyを取得」を実装して安全にキャッシュデータの削除や更新を行えるようにしましょう。

実装例

app/models/concerns/cache_util.rb
module CacheUtil
  def scan_all(*patterns)
    all_keys = Set.new
    patterns.each do |pattern|
      all_keys += scan_each(match: pattern).to_a
    end
    all_keys.to_a
  end
end

all_keysをSet型として用意し、scan_each(match: pattern).to_aで取得したキーの配列との和集合を常に取る形です。

使用例

例えば「Userデータを更新した時に、Keyの名前に "user" , "example" の文字を含むキャッシュを削除する」というケースの処理は以下の通りです。

app/models/user.rb
class User < ApplicationRecord
  include CacheUtil

  # some code

  after_update :delete_cache

  # some code

  def delete_cache
    redis = Redis.current
    keys = scan_all("*user*","*example*")
    redis.del(keys) if keys.present?
  end
end

EXECMULTIといったトランザクション内では使用出来ないので注意してください。

終わり

今後Redis関連のissueがあるかは分かりませんが、Redisには多くのコマンドがあるみたいなので勉強しておこうと思います。

質問・ご指摘はコメント欄にお願いします。

tsuboyataiki
現在IT系専門学校1年生18歳。 食×ITやECサービスに興味があり、高校時代に食材管理アプリを開発。埼玉県のコンテストで75作品中最優秀賞を受賞。しかし、コンテストのためのプログラミングに疑問を抱く。 業務レベルの高いスキルを身につけるため、専門入学と同時に買い物サポートメディアを運営するベンチャー企業にWebエンジニアインターンとして入社。主にRailsを用いたバックエンド業務を担当。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした