概要
Redisに保存されている値を見たい時にkeysコマンドをつかって
$ redis-cli keys *
でkeyを取得してkeyを元にgetコマンドを作るって記事がわりとあるけど
実際にproductionとしてredisを運用しているとここに罠があるので紹介
Redis is 何?
公式サイト
所謂、NoSQLとかKVSって言われているやつの代表格
特徴として
- ネットワーク接続されたインメモリデータベース
- キー・バリュー型データベース
- オプションとして永続性を持つ
- シングルスレッドで動作する
シングルスレッドで動作する
keysでサチる
Redisの説明でも書いたが
シングルスレッドで動作する (正確にはクエリを処理するスレッドは1つ)
ってところが罠なのだが、この仕組みによりAtomicな操作が可能になっている
実際にproductionで本番運用させていくと
データ永続化可能なこともありkeyの数が膨大に増えていくことがあよくある
自分が実際に携わっていたアプリに関して言うと13万keyを軽く超えていた
そうなってくると
誰かがkeysコマンドを*(ワイルドカード)で叩くと
keyを取得するためだけにプロセスが使われてしまい
webサイトやAPI等からgetやsetされる処理が待ち状態になり
webサーバのプロセスが大量に増えていき
サーバ自体のリソースを食いつぶしていく
ということが起きる
結論
qiitaとかで調べてあまりRedisを理解していない段階で
本番環境とかにkeysを気軽に投げると死ぬことがあるよっていうこと
ちゃんと理解してから利用しましょう