unless’s blog

日々のちょっとした技術的なことの羅列

Redis keysコマンドの罠

概要

Redisに保存されている値を見たい時にkeysコマンドをつかって

$ redis-cli keys *

でkeyを取得してkeyを元にgetコマンドを作るって記事がわりとあるけど
実際にproductionとしてredisを運用しているとここに罠があるので紹介

Redis is 何?

公式サイト

redis.io

所謂、NoSQLとかKVSって言われているやつの代表格
特徴として

  • ネットワーク接続されたインメモリデータベース
  • キー・バリュー型データベース
  • オプションとして永続性を持つ
  • シングルスレッドで動作する

シングルスレッドで動作する

keysでサチる

Redisの説明でも書いたが
シングルスレッドで動作する (正確にはクエリを処理するスレッドは1つ)
ってところが罠なのだが、この仕組みによりAtomicな操作が可能になっている

redis.io

実際にproductionで本番運用させていくと
データ永続化可能なこともありkeyの数が膨大に増えていくことがあよくある

自分が実際に携わっていたアプリに関して言うと13万keyを軽く超えていた

そうなってくると
誰かがkeysコマンドを*(ワイルドカード)で叩くと
keyを取得するためだけにプロセスが使われてしまい
webサイトやAPI等からgetやsetされる処理が待ち状態になり
webサーバのプロセスが大量に増えていき
サーバ自体のリソースを食いつぶしていく
ということが起きる

結論

qiitaとかで調べてあまりRedisを理解していない段階で
本番環境とかにkeysを気軽に投げると死ぬことがあるよっていうこと
ちゃんと理解してから利用しましょう