Redis
エンジニアのためのWebチートシート
Redisは、高速なインメモリデータストアです。 キャッシュ、セッション管理、リアルタイムランキング、メッセージキューなど幅広い用途に使われます。 データ型、キー管理、Pub/Sub、ストリーム、トランザクション、実用パターンなどをチートシートにまとめました。
接続 & キー管理
接続
redis-cli でサーバーに接続する方法です。
redis-cli redis-cli -h 127.0.0.1 -p 6379 redis-cli -h host -p 6379 -a password redis-cli -u redis://user:pass@host:6379/0 redis-cli --tls -h host -p 6380PING # => PONG SELECT 1 # DB選択(0〜15) AUTH password AUTH username password # ACL対応
キー操作
キーの検索、確認、削除、名前変更です。
KEYS user:* # パターンマッチ(本番非推奨) SCAN 0 MATCH user:* COUNT 100 # 安全なイテレータ EXISTS key # 存在確認 => 1 or 0 TYPE key # データ型 OBJECT ENCODING key # 内部エンコーディングDEL key1 key2 # 同期削除 UNLINK key1 key2 # 非同期削除 RENAME key newkey RENAMENX key newkey # newkey が存在しない場合のみ COPY source destination # Redis 6.2+ MEMORY USAGE key DBSIZE # 現在のDBのキー数
有効期限 (TTL)
キーの有効期限の設定と確認です。
EXPIRE key 120 # 120秒後に期限切れ PEXPIRE key 120000 # ミリ秒指定 EXPIREAT key 1672531200 # UNIXタイムスタンプ指定 TTL key # 残り秒数(-1:無期限, -2:不在) PTTL key # 残りミリ秒数 PERSIST key # 無期限に戻すSET key "value" EX 60 # 60秒で期限切れ SET key "value" PX 60000 # ミリ秒指定 SETEX key 120 "value" # 120秒 PSETEX key 120000 "value" # ミリ秒
文字列 (Strings)
基本操作
文字列の取得・設定・一括操作です。
SET key "value" GET key # => "value" SETNX key "value" # 存在しない場合のみ MSET k1 "v1" k2 "v2" k3 "v3" MGET k1 k2 k3 GETSET key "new_value" # => "old_value"APPEND key " world" # 値に追記 STRLEN key # 文字列長 GETRANGE key 0 4 # 部分文字列取得 SETRANGE key 6 "Redis" # 部分文字列書き換え
数値操作
文字列に格納された数値のインクリメント・デクリメントです。
SET counter 10 INCR counter # +1 => 11 INCRBY counter 5 # +5 => 16 DECR counter # -1 => 15 DECRBY counter 3 # -3 => 12 INCRBYFLOAT counter 1.5 # +1.5 => "13.5"# カウンター例 INCR page:views:/home INCR stats:2026-02-21:visits EXPIRE stats:2026-02-21:visits 604800
SET オプション
SET コマンドの条件付き・期限付きオプションです。
SET key "value" EX 60 # 秒単位の有効期限 SET key "value" PX 60000 # ミリ秒単位 SET key "value" NX # 存在しない場合のみ SET key "value" XX # 存在する場合のみ SET key "value" NX EX 60 # 組み合わせ SET key "new" GET # 古い値を返す(6.2+)# 分散ロックパターン SET lock:resource "owner_id" NX EX 30 # NX: 他がロック中なら失敗, EX 30: 自動解放
ハッシュ & リスト
ハッシュ (Hashes)
フィールドと値のペアを持つオブジェクト表現です。
HSET user:1001 name "Alice" age 30 email "a@ex.com" HGET user:1001 name # => "Alice" HMGET user:1001 name age # 複数フィールド HGETALL user:1001 # 全フィールドと値 HSETNX user:1001 role "admin" # 存在しない場合のみHDEL user:1001 email # フィールド削除 HEXISTS user:1001 name # 存在確認 HLEN user:1001 # フィールド数 HKEYS user:1001 # 全フィールド名 HVALS user:1001 # 全値 HINCRBY user:1001 age 1 # 整数加算 HINCRBYFLOAT user:1001 score 0.5 HSCAN user:1001 0 MATCH na* COUNT 10
リスト (Lists)
挿入順序を保持するリストです。キューやスタックに最適です。
LPUSH mylist "c" "b" "a" # 先頭に追加 RPUSH mylist "d" "e" # 末尾に追加 LRANGE mylist 0 -1 # 全要素 LINDEX mylist 0 # インデックスで取得 LLEN mylist # リスト長LPOP mylist # 先頭を取り出し RPOP mylist # 末尾を取り出し LPOP mylist 3 # 先頭から3つ(6.2+) LINSERT mylist BEFORE "c" "b2" LSET mylist 0 "new_value" # インデックス0を更新 LREM mylist 2 "value" # 先頭から2つ削除 LTRIM mylist 0 99 # 先頭100件のみ保持 LMOVE source dest LEFT RIGHT # 移動(6.2+)
ブロッキング操作
データが来るまで待機するメッセージキュー向け操作です。
BLPOP mylist 30 # 先頭取り出し(最大30秒待機) BLPOP list1 list2 30 # 複数リストを監視 BRPOP mylist 30 # 末尾取り出し(待機) BLMOVE source dest LEFT RIGHT 30 # 6.2+# メッセージキュー例 RPUSH queue:emails '{"to":"alice@example.com"}' BLPOP queue:emails 0 # ワーカーが無限待機 # 信頼性の高いキュー(RPOPLPUSH パターン) LMOVE queue:tasks queue:processing LEFT RIGHT LREM queue:processing 1 "task_data"
セット & ソート済みセット
セット (Sets)
ユニークな要素の集合と集合演算です。
SADD myset "apple" "banana" "cherry" SREM myset "banana" # 削除 SISMEMBER myset "apple" # 存在確認 SMEMBERS myset # 全メンバー SCARD myset # メンバー数 SRANDMEMBER myset 2 # ランダム取得 SPOP myset # 取り出し(削除) SMOVE source dest "apple" # 移動SINTER set1 set2 # 積集合 SUNION set1 set2 # 和集合 SDIFF set1 set2 # 差集合 SINTERSTORE dest set1 set2 # 結果を保存 SUNIONSTORE dest set1 set2 SDIFFSTORE dest set1 set2 SSCAN myset 0 MATCH a* COUNT 10
ソート済みセット (Sorted Sets)
スコア付きのユニークな要素の集合です。
ZADD board 100 "alice" 85 "bob" 92 "charlie" ZADD board NX 80 "dave" # 存在しない場合のみ ZADD board XX 95 "alice" # 存在する場合のみ ZADD board GT 90 "alice" # 現スコアより大きい場合のみ ZINCRBY board 10 "bob" # スコア加算 ZSCORE board "alice" # スコア取得ZRANGE board 0 -1 WITHSCORES # 昇順(スコア付き) ZREVRANGE board 0 2 # 降順トップ3 ZRANGEBYSCORE board 80 100 # スコア範囲で取得 ZREM board "dave" ZREMRANGEBYSCORE board 0 50 # スコア範囲で削除 ZREMRANGEBYRANK board 0 1 # ランク範囲で削除 ZCARD board # 総数 ZCOUNT board 80 100 # スコア範囲内の数
ランキング操作
スコアベースのランキング取得と集合演算です。
ZRANK board "alice" # 昇順ランク(0始まり) ZREVRANK board "alice" # 降順ランク ZPOPMIN board 1 # 最低スコアを取り出し ZPOPMAX board 1 # 最高スコアを取り出し BZPOPMIN board 30 # ブロッキング版ZUNIONSTORE dest 2 zset1 zset2 ZINTERSTORE dest 2 zset1 zset2 ZUNIONSTORE dest 2 zset1 zset2 WEIGHTS 1 2 ZUNIONSTORE dest 2 zset1 zset2 AGGREGATE MAX ZSCAN board 0 MATCH a* COUNT 10# リーダーボード例 ZADD game:leaderboard 1500 "player1" ZINCRBY game:leaderboard 50 "player1" ZREVRANGE game:leaderboard 0 9 WITHSCORES ZREVRANK game:leaderboard "player1"
Pub/Sub & ストリーム
Pub/Sub
リアルタイムのメッセージ配信・購読です。
SUBSCRIBE channel1 channel2 # 購読 PSUBSCRIBE user:* # パターン購読 PUBLISH channel1 "Hello!" # 配信 UNSUBSCRIBE channel1 PUNSUBSCRIBE user:*PUBSUB CHANNELS # アクティブチャネル PUBSUB CHANNELS user:* # パターンでフィルタ PUBSUB NUMSUB channel1 # 購読者数 # fire-and-forget方式。永続化にはStreamsを使用
ストリーム基本
イベントログやメッセージキューに最適なデータ構造です。
XADD mystream * sensor_id 1234 temp 19.8 XLEN mystream # エントリ数 XRANGE mystream - + # 全件(古い順) XRANGE mystream - + COUNT 10 # 先頭10件 XREVRANGE mystream + - # 新しい順XREAD COUNT 5 STREAMS mystream 0 XREAD COUNT 5 BLOCK 5000 STREAMS mystream $ XTRIM mystream MAXLEN 1000 # 最大1000件 XTRIM mystream MAXLEN ~ 1000 # おおよそ(高速) XDEL mystream 1526569495631-0 XINFO STREAM mystream
コンシューマグループ
複数ワーカーでストリームを分散処理する仕組みです。
# $:新規のみ, 0:既存も含める XGROUP CREATE mystream mygroup $ MKSTREAM XREADGROUP GROUP mygroup consumer1 \ COUNT 1 STREAMS mystream > XACK mystream mygroup 1526569495631-0 XPENDING mystream mygroup# 1時間以上未処理のエントリを移譲 XCLAIM mystream mygroup consumer2 \ 3600000 1526569495631-0 XINFO GROUPS mystream XINFO CONSUMERS mystream mygroup XGROUP DESTROY mystream mygroup XGROUP DELCONSUMER mystream mygroup consumer1
トランザクション & スクリプト
トランザクション
MULTI/EXEC による複数コマンドのアトミック実行です。
MULTI # 開始 SET user:1:balance 100 # => QUEUED DECRBY user:1:balance 30 # => QUEUED INCRBY user:2:balance 30 # => QUEUED EXEC # 実行 DISCARD # キューを破棄# 楽観的ロック(WATCH) WATCH user:1:balance GET user:1:balance MULTI SET user:1:balance 70 EXEC # 監視中に変更されていたら nil UNWATCH # 全WATCHを解除 # read-modify-write には Lua スクリプトを推奨
Lua スクリプティング
サーバーサイドでアトミックな複合操作を実行します。
EVAL "return 'Hello'" 0 EVAL "return ARGV[1]" 0 "Hello" EVAL "return redis.call('GET', KEYS[1])" 1 mykey# 条件付き更新(アトミック) EVAL " local cur = redis.call('GET', KEYS[1]) if cur == false then redis.call('SET', KEYS[1], ARGV[1]) return 1 end return 0 " 1 mykey "default_value"# レートリミッター EVAL " local c = redis.call('INCR', KEYS[1]) if c == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]) end return c > tonumber(ARGV[2]) and 0 or 1 " 1 ratelimit:user123 60 100SCRIPT LOAD "return redis.call('GET', KEYS[1])" EVALSHA <sha1> 1 mykey # キャッシュから実行 SCRIPT EXISTS <sha1> SCRIPT FLUSH SCRIPT KILL
実用パターン
キャッシュ・ロック・レートリミッター
よく使われるRedisの実用パターンです。
# Cache-Aside パターン SET cache:user:1001 '{"name":"Alice"}' EX 300 GET cache:user:1001 # ヒット or nil# 分散ロック SET lock:resource "owner_id" NX EX 30 # ロック解放(Luaでオーナー確認) EVAL " if redis.call('GET',KEYS[1])==ARGV[1] then return redis.call('DEL',KEYS[1]) end return 0 " 1 lock:resource "owner_id"# レートリミッター(固定ウィンドウ) INCR ratelimit:api:user123 EXPIRE ratelimit:api:user123 60 # スライディングウィンドウ ZADD ratelimit:user123 <timestamp> <req_id> ZREMRANGEBYSCORE ratelimit:user123 0 <old_ts> ZCARD ratelimit:user123
セッション・リーダーボード・カウント
セッション管理、ランキング、ユニークカウントのパターンです。
# セッションストア HSET session:abc123 user_id 1001 \ username "alice" role "admin" EXPIRE session:abc123 1800 HGETALL session:abc123# リーダーボード ZADD leaderboard 1500 "player1" ZINCRBY leaderboard 50 "player1" ZREVRANGE leaderboard 0 9 WITHSCORES ZREVRANK leaderboard "player1"# HyperLogLog(誤差0.81%、最大12KB) PFADD visitors:20260221 "user1" "user2" PFCOUNT visitors:20260221 PFMERGE visitors:week visitors:20260215 ... # ビットマップ SETBIT logins:user:1001:202602 20 1 BITCOUNT logins:user:1001:202602
永続化 & 設定
データの永続化方式の比較です。
| RDB (スナップショット) | AOF (追記型ログ) |
|---|---|
ポイントインタイムのスナップショット | 全書き込み操作のログ |
復旧が高速 | 復旧が低速(ログ再生) |
最後のスナップショット以降のデータ損失リスク | everysec なら最大1秒分の損失 |
ファイルがコンパクト | ファイルが大きくなりがち |
BGSAVE / SAVE | BGREWRITEAOF |
推奨: バックアップ、災害復旧 | 推奨: 高いデータ耐久性が必要な場合 |
サーバー情報 & 設定
INFO, CONFIG, メモリ管理のコマンドです。
INFO # 全情報 INFO server / memory / clients / keyspace CONFIG GET maxmemory CONFIG SET maxmemory 256mb CONFIG SET maxmemory-policy allkeys-lru CONFIG REWRITE # redis.confに保存MEMORY STATS MEMORY DOCTOR # 問題診断 CLIENT LIST # 接続一覧 CLIENT SETNAME myapp CLIENT KILL ID 123 SLOWLOG GET 10 # 遅いコマンド10件 DBSIZE # キー数 FLUSHDB # 現DBの全キー削除 FLUSHALL # 全DBの全キー削除
redis-cli ユーティリティ
統計 & 分析
redis-cli のパフォーマンス分析ツールです。
redis-cli --stat # ローリング統計 redis-cli --bigkeys # 大きなキー検出 redis-cli --latency # レイテンシ測定 redis-cli --latency-history redis-cli --latency-dist redis-cli --intrinsic-latency 5 redis-cli --scan --pattern "user:*" redis-cli MONITOR # 全コマンド表示
一括操作 & ユーティリティ
一括処理やデータ転送の便利コマンドです。
redis-cli --pipe < commands.txt # 一括投入 redis-cli --rdb /tmp/dump.rdb # RDBダンプ取得 redis-cli --eval script.lua key1 , arg1 redis-cli --csv LRANGE mylist 0 -1 redis-cli --repeat 100 --interval 1 PING redis-cli -n 2 # DB選択redis-cli BGSAVE # RDBスナップショット redis-cli BGREWRITEAOF # AOF書き直し redis-cli LASTSAVE # 最後の保存時刻