こんにちはしばたにえんです
今回は、Redisのスローログを確認する方法とKEYS
ではなくSCAN
を使った方がいい理由について紹介します。
スローログを確認する手順
1. redis-cliでredisに接続する
redis-cli -h sample-redis-host
2. スローログを取得するクエリを実行する
slowlog get 128
128 は取得するスローログの件数
1) 1) (integer) 6 2) (integer) 1683509330 3) (integer) 17108 4) 1) "GET" 2) "0" 4) "sampleKey" ...
こんな感じで表示されます。
見方としては
1) 自動採番されたID 2) クエリ実行時のUnixタイムスタンプ 3) クエリ実行にかかった時間(マイクロ秒) 4) クエリとそのパラメータ
となってます。
Redisの注意点
Redisはシングルスレッドで動いているため、スロークエリがあった場合に他のリクエストも全てスロークエリの実行が終わるまでレスポンスが返せなくなってしまいます。
なので、当前ですが、クエリを実行する場合は細心の注意を
KEYSは使わない方がいい
データが入っているか確認したいときにKEYS
を実行してデータを取得したいなんてことがありますが、おすすめできません。
KEYS
は指定の条件のキーを全て見に行きます。この処理が終わるまで他の処理は待たないといけません。
代わりにSCAN
を使いましょう。
SCANの概要
SCANはカーソルベースで繰り返し実行することでキーを取得します。-- COUNT
オプションの件数分(指定しなければ10件まで)データを取得し終えると処理を止めてキーと次のカーソルを返してくれます。
次のカーソルが0になったとき全てのキーの検出の完了となります。
SCANを実行する
SCAN 0 # プレフィックス指定で取得したい場合 SCAN 0 MATCH "sample*"
0番目の要素から取得します。
SCAN 0 MATCH "sample*" 1) "53" 2) 1) "sample:da1f1052aef0582e8f5472df91a74c0f" 2) "sample:ae6d55e35b80643d45fe0351de523068" 3) "sample:db93635af5fdc8366f666cc55d18cc3f"
こんな感じで表示されます。
見方としては
1) 次の呼び出しで使う新しいカーソル 2) キーの配列
となります。
次の呼び出しで使う新しいカーソルが0になるまで実行しましょう
SCAN 53 MATCH "sample*" 1) "0" 2) 1) "sample:ba18d60898fecb5c8fa68c425f61b45a"
これでsample
に前方一致するキーは
sample:da1f1052aef0582e8f5472df91a74c0f sample:ae6d55e35b80643d45fe0351de523068 sample:db93635af5fdc8366f666cc55d18cc3f sample:ba18d60898fecb5c8fa68c425f61b45a
の4つということがわかります。