Redis
概要
Redisはインメモリデータストアで、極めて高速な読み書きのためにデータをRAMに保持し、オプションでディスクへの永続化も行えます。キーバリューストアとして機能しますが、リスト、セット、ソート済みセット、ハッシュ、ストリームといった豊富なデータ構造をサポートします。プライマリデータベースと併用して、キャッシュ、セッションストア、キュー、レートリミッターとして使われることが最も多いです。
強み
- インメモリ動作によるサブミリ秒のレイテンシ。
- 多彩な構造:文字列、ハッシュ、リスト、セット、ソート済みセット、ストリーム。
- 組み込みのTTL/有効期限により、キャッシュやセッションに最適。
- 安全なカウンターやロックのためのアトミック操作とLuaスクリプティング。
- pub/subとストリームがメッセージングやイベントパイプラインをサポートする。
トレードオフ
- データは利用可能なメモリによって制限され、大規模なデータセットはコストが高くつく。
- 永続化はオプションで、クラッシュ時に直近の書き込みを失うことがある。
- 耐久性のあるリレーショナルストアの代わりにはならない。
- クラスタリングは、シャーディングやフェイルオーバーのための運用上の複雑さを増す。
使いどころ
高コストなクエリ結果のキャッシュ、セッションの保存、レートリミットの実装、ジョブキューの管理、リーダーボードの構築、リアルタイムメッセージの受け渡しに、Redisを使いましょう。信頼できる情報源を保持する耐久性のあるデータベースと組み合わせて使います。
バイブコーディングとの相性
AIに指示を出す際は、Redisがシステムオブレコードではなくキャッシュや補助的なストアであることを明確にし、キャッシュエントリには常にTTLを設定させ、明確なキー命名スキーム(例:user:123:profile)を設計させましょう。競合し得るread-modify-writeのシーケンスではなく、カウンターにはINCR、ロックにはSET ... NX EXのようなアトミックなコマンドを使わせます。良いコツとして、AIにはcache-asideパターン(キャッシュを読み、なければデータベースにフォールバックし、その後キャッシュを埋める)を実装させ、古いデータが残らないよう無効化戦略を説明させましょう。
# 1時間の有効期限つきで値をキャッシュする
SET user:123:profile "{\"name\":\"Ada\"}" EX 3600
# アトミックなレートリミットカウンター
INCR rate:ip:203.0.113.5
EXPIRE rate:ip:203.0.113.5 60
# 分散ロック:存在しない場合のみセットし、自動で期限切れにする
SET lock:job:42 "owner-a" NX EX 30
# ソート済みセットによるリーダーボード
ZADD leaderboard 4200 "player:7"
ZREVRANGE leaderboard 0 9 WITHSCORES