Redis

2026.04.10

公式ドキュメント

この記事の要点

SET/GETが基本、EXPIREでTTL設定が必須
• 5つのデータ型(String/List/Hash/Set/Sorted Set)を用途で使い分け
• 本番ではKEYS *は厳禁、SCANを使う

概要

Redis はメモリ上で動作する高速な Key-Value ストアで、キャッシュ、セッション、レートリミット、キュー、Pub/Sub など幅広く使われます。本チートシートは redis-cli から実行する代表的コマンドを、Redis 7.x の公式ドキュメントに沿って整理しています。

接続と基本

コマンド説明
redis-cliローカルの Redis に接続
redis-cli -h host -p 6379任意ホスト/ポートに接続
redis-cli -a passwordパスワード付きで接続
redis-cli --tlsTLS 接続
PING接続確認(PONG が返る)
AUTH password認証
SELECT 0DB インデックス選択(0-15)
INFOサーバ情報
DBSIZE現在 DB のキー数
FLUSHDB現在 DB を全削除
FLUSHALL全 DB を全削除

注意: FLUSHALLは全DBの全キーを削除します。本番環境では絶対に実行しないでください。FLUSHDBも現在のDB全体が消えるので要注意です。

キー操作

コマンド説明
KEYS patternパターンに合うキー一覧(本番では非推奨)
SCAN cursor MATCH pat COUNT nカーソル反復(本番用)
EXISTS key [key ...]キーの存在確認
DEL key [key ...]キー削除
UNLINK key [key ...]非同期削除(推奨)
TYPE key値の型
RENAME key newkeyリネーム
EXPIRE key seconds有効期限(秒)
PEXPIRE key ms有効期限(ミリ秒)
EXPIREAT key unixtime絶対時刻で期限
TTL key残り秒数
PERSIST key期限を除去
RANDOMKEYランダムなキー

ポイント: SCANはカーソルベースの安全な反復。KEYS *はO(N)でRedisをブロックするため、本番では絶対にSCANを使いましょう。

文字列(String)

コマンド説明
SET key value値を設定
SET key value EX 6060 秒の TTL 付きで設定
SET key value NXキーが無い場合のみ設定
SET key value XXキーが有る場合のみ設定
GET key値を取得
MSET k1 v1 k2 v2複数セット
MGET k1 k2複数取得
GETSET key value旧値を返して更新(非推奨、SET ... GET
APPEND key value末尾に追記
STRLEN key文字列長
INCR key1 加算
INCRBY key nn 加算
DECR key1 減算
INCRBYFLOAT key f浮動小数加算
GETRANGE key start end部分文字列
SETRANGE key offset value部分書き換え

実践メモ: SET key value EX 60 NXで「キーが無い場合のみ60秒TTLで設定」。分散ロックやキャッシュのスタンピード対策に使えます。

リスト(List)

コマンド説明
LPUSH key v [v...]先頭に追加
RPUSH key v [v...]末尾に追加
LPOP key [count]先頭取り出し
RPOP key [count]末尾取り出し
LRANGE key 0 -1全要素取得
LLEN key長さ
LINDEX key iインデックス指定取得
LSET key i valueインデックス指定で更新
LREM key count value値を削除
LTRIM key start stop範囲外を削除
BLPOP key timeoutブロッキング LPOP
BRPOP key timeoutブロッキング RPOP
LMOVE src dst LEFT RIGHT要素を移動

ハッシュ(Hash)

コマンド説明
HSET key f v [f v...]フィールドを設定
HGET key f取得
HMGET key f1 f2複数取得
HGETALL key全フィールド取得
HDEL key f [f...]フィールド削除
HEXISTS key fフィールド存在確認
HKEYS keyフィールド名一覧
HVALS key値一覧
HLEN keyフィールド数
HINCRBY key f n整数加算
HINCRBYFLOAT key f f浮動小数加算
HSCAN key cursorカーソル反復

セット(Set)

コマンド説明
SADD key m [m...]要素を追加
SREM key m要素を削除
SMEMBERS key全要素
SISMEMBER key m所属確認
SMISMEMBER key m1 m2複数所属確認
SCARD key要素数
SUNION k1 k2和集合
SINTER k1 k2積集合
SDIFF k1 k2差集合
SRANDMEMBER key [n]ランダム要素
SPOP key [n]ランダム取り出し

ポイント: ハッシュ(Hash)はユーザープロフィールなど「1エンティティの複数フィールド」を格納するのに最適。キー1つで管理でき、メモリ効率も良いです。

ソート済みセット(Sorted Set)

コマンド説明
ZADD key score member要素を追加
ZADD key NX/XX/GT/LT score member条件付き追加
ZRANGE key 0 -1 WITHSCORESスコア昇順
ZRANGE key 0 -1 REV降順
ZRANGEBYSCORE key min maxスコア範囲
ZRANGEBYLEX key min max辞書順範囲
ZRANK key member昇順ランク
ZREVRANK key member降順ランク
ZSCORE key memberスコア取得
ZINCRBY key n memberスコア加算
ZCARD key要素数
ZCOUNT key min maxスコア範囲の件数
ZREM key member要素を削除
ZPOPMIN key [n]最小スコアを取り出す
ZPOPMAX key [n]最大スコアを取り出す

Pub/Sub

コマンド説明
PUBLISH channel messageメッセージ送信
SUBSCRIBE channelチャンネル購読
UNSUBSCRIBE [channel]購読解除
PSUBSCRIBE patternパターン購読
PUBSUB CHANNELSアクティブチャンネル一覧
PUBSUB NUMSUB [ch...]購読者数

Streams(簡易)

コマンド説明
XADD stream * key valueエントリ追加
XLEN stream長さ
XRANGE stream - +全件取得
XREAD COUNT 10 STREAMS stream 0読み出し
XGROUP CREATE stream grp $コンシューマグループ作成
XREADGROUP GROUP grp cons COUNT 1 STREAMS stream >グループ読み
XACK stream grp idACK

トランザクション / スクリプト

コマンド説明
MULTIトランザクション開始
EXEC実行
DISCARD破棄
WATCH key楽観ロック
EVAL script numkeys key... arg...Lua スクリプト実行
EVALSHA sha1 ...キャッシュされたスクリプト実行
SCRIPT LOAD scriptスクリプトを事前ロード

実践メモ: Sorted Setはランキング実装の定番。ZADDでスコア付き追加、ZREVRANGEで上位取得。リアルタイムランキングボードに最適です。

注意: Pub/Subはメッセージを永続化しません。購読者がいない間のメッセージは失われます。永続性が必要ならStreamsを使いましょう。

実用スニペット集

ユースケースコマンド
キャッシュ書き込み(TTL 付き)SET user:42 "{\"name\":\"Ada\"}" EX 300
レートリミット(固定ウィンドウ)INCR rl:ip:1.2.3.4
EXPIRE rl:ip:1.2.3.4 60 NX
分散ロック(単純版)SET lock:job1 token NX EX 10
# 解放は Lua で値を検証してから DEL
ランキングZADD scores 120 alice 95 bob 140 carol
ZREVRANGE scores 0 9 WITHSCORES
ZREVRANK scores alice
最近使ったアイテム(LRU 風)LPUSH recent:42 "item-9"
LTRIM recent:42 0 19
セッションハッシュHSET sess:abc user 42 ip 1.2.3.4 ts 1712700000
EXPIRE sess:abc 3600
ユニーク訪問者集計(HyperLogLog)PFADD uv:2026-04-12 user1 user2 user3
PFCOUNT uv:2026-04-12
PFMERGE uv:week uv:2026-04-06 uv:2026-04-07 ...
ビットマップによる出席管理SETBIT present:2026-04-12 42 1
GETBIT present:2026-04-12 42
BITCOUNT present:2026-04-12
本番で安全にキーを探すSCAN 0 MATCH "user:*" COUNT 1000
パイプライン(redis-cli)printf "SET a 1\nSET b 2\nINCR a\n" | redis-cli --pipe
キー削除をバッチでredis-cli --scan --pattern "tmp:*" | xargs -n 100 redis-cli UNLINK
Pub/Sub 受信SUBSCRIBE news
# 別クライアントから: PUBLISH news "hello"
楽観的トランザクションWATCH counter
val = GET counter
MULTI
SET counter (val+1)
EXEC
Lua スクリプトで原子的処理EVAL "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end" 1 lock:job1 token
永続化の手動実行BGSAVE (RDB スナップショット)
BGREWRITEAOF (AOF 書き換え)
LASTSAVE (最終保存時刻)

redis-cli フラグ早見表

フラグ説明
-h hostホスト
-p portポート
-a passパスワード
-n dbDB 番号
--tlsTLS 接続
-r n -i sec cmd繰り返し実行
--scan --pattern patパターンで SCAN
--pipeパイプモード(一括流し込み)
--latency遅延測定
--stat統計モニタ
MONITOR全コマンドをリアルタイム監視

トラブルシューティング

状況原因 / 対処
(error) NOAUTH認証が必要。AUTH またはクライアント設定
(error) OOM command not allowedmaxmemory 到達。maxmemory-policy と期限を見直す
KEYS で応答が止まるO(N) でブロック。SCAN を使う
期限が消えないPERSIST か、SET 時の KEEPTTL 考慮
Pub/Sub で取りこぼしPub/Sub は非永続。必要なら Streams に移行
レプリカが追いつかないreplica-read-only、帯域・repl-backlog を確認

Tips

  • 本番では KEYS * を絶対に使わず、SCAN を使う。
  • 大きなキー削除は DEL より UNLINK のほうが安全(非同期)。
  • 重要データは AOF(everysec)+ RDB を併用して永続化する。
  • キー名は user:42:profile のように : 区切りの階層命名が一般的。
  • TTL を必ず設計する(期限のないキャッシュはメモリ枯渇の元)。
  • 複数コマンドの原子性が必要なら MULTI/EXEC か Lua スクリプトを使う。

サーバ管理

コマンド説明
CONFIG GET parameter設定値を取得
CONFIG SET parameter value設定値を変更
CONFIG REWRITE現在の設定を設定ファイルへ書き戻し
CLIENT LIST接続中クライアント一覧
CLIENT KILL addrクライアント切断
SLOWLOG GET nスロークエリ
LATENCY LATEST最新レイテンシイベント
MEMORY USAGE keyキーのメモリ使用量
MEMORY STATSメモリ統計
DEBUG SLEEP sec遅延シミュレーション(検証用)
`SHUTDOWN [NOSAVESAVE]`
TIMEサーバ時刻
ROLEレプリカ構成を表示

レプリケーション / クラスタ

コマンド説明
REPLICAOF host portレプリカ化
REPLICAOF NO ONEマスター昇格
INFO replicationレプリカ情報
CLUSTER NODESクラスタノード一覧
CLUSTER INFOクラスタ状態
CLUSTER SLOTSスロット割当
CLUSTER KEYSLOT keyキーのスロット番号
redis-cli --cluster create host:port ...クラスタ構築
redis-cli --cluster check host:portクラスタ検査

クライアントコード(Node.js: node-redis 例)

import { createClient } from "redis";

const client = await createClient({ url: "redis://localhost:6379" })
  .on("error", (e) => console.error(e))
  .connect();

await client.set("k", "v", { EX: 60 });
const v = await client.get("k");

// パイプライン相当
const multi = client.multi();
multi.incr("count");
multi.expire("count", 3600);
const results = await multi.exec();

await client.quit();

クライアントコード(Python: redis-py 例)

import redis

r = redis.Redis(host="localhost", port=6379, decode_responses=True)

r.set("k", "v", ex=60)
print(r.get("k"))

with r.pipeline() as pipe:
    pipe.incr("count").expire("count", 3600)
    pipe.execute()

キャッシュ設計のポイント

項目推奨
TTL必ず設定する。無期限は慎重に
キー命名domain:entity:id[:attr] 形式で階層化
大きい値100KB 以上は分割や別ストアを検討
N+1 防止MGET や Pipeline を活用
スタンピード対策ランダム TTL、単一フライト、early refresh
永続化AOF(everysec) + RDB を併用

設定ファイル抜粋(redis.conf)

代表的な項目のみ挙げます。実際の値は環境に合わせて調整してください。

項目説明
bind 127.0.0.1接続を受け付ける IP
port 6379ポート
requirepass yourpassパスワード
maxmemory 2gb使用メモリ上限
maxmemory-policy allkeys-lru退避ポリシー
appendonly yesAOF 有効
appendfsync everysecAOF フラッシュ頻度
save 900 1RDB スナップショット条件
tcp-keepalive 300TCP keepalive
tls-port 6380TLS ポート

退避(eviction)ポリシー

ポリシー説明
noeviction書き込み時にエラーを返す(既定)
allkeys-lru全キーから LRU で退避
allkeys-lfu全キーから LFU で退避
volatile-lru期限付きキーから LRU で退避
volatile-lfu期限付きキーから LFU で退避
allkeys-randomランダム退避
volatile-ttlTTL の短いものから退避

モニタリングコマンド

用途コマンド
現在の統計を 1 秒ごとに表示redis-cli --stat
レイテンシの最悪値redis-cli --latency
継続計測redis-cli --latency-history -i 5
全コマンドの可視化(本番で多用禁止)redis-cli MONITOR
メモリの概況redis-cli INFO memory

キー使用量の上位を取る

用途コマンド
各型で最大のキーredis-cli --bigkeys
メモリ使用量で上位redis-cli --memkeys
ホットキー検出redis-cli --hotkeys

Keyspace 通知

用途コマンド
有効化(K=イベント、E=キー)redis-cli CONFIG SET notify-keyspace-events KEA
変更を購読redis-cli PSUBSCRIBE '__keyspace@0__:*'

参考リソース

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る