CheatSheet
日本語 icon日本語English iconEnglish
チートシートとはカンニングペーパーのことです。それが転じて、本来覚えることをまとめておいたものです。
要点をすぐに参照できるようにまとめてみました。

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 6380
    PING                  # => 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 100
    SCRIPT 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           # 最後の保存時刻