Redisのスローログを確認する方法とKEYSではなくSCANを使った方がいい理由

こんにちはしばたにえんです 今回は、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つということがわかります。

参考

mogile.web.fc2.com mogile.web.fc2.com