Redis コマンド 使い方徹底解説

はい、承知いたしました。「Redis コマンド 使い方徹底解説」の詳細な説明を含む約5000語の記事を記述します。


Redis コマンド 使い方徹底解説

はじめに

近年、Webアプリケーション開発やデータ処理において、超高速なデータアクセスが求められる場面が増えています。このような要求に応える技術の一つが、インメモリデータストアである Redis です。

Redis は、単なるキーバリュー型のストアにとどまらず、多様なデータ構造(文字列、リスト、セット、ハッシュ、ソート済みセットなど)をサポートし、永続化、 Pub/Sub 、トランザクション、スクリプト実行など、豊富な機能を備えています。これらの機能を最大限に活用するためには、Redis が提供する強力なコマンド群を理解し、使いこなすことが不可欠です。

本記事では、Redis の基本概念から始め、主要なデータ構造に関連するコマンド、高度な機能に関するコマンド、そしてサーバー管理コマンドまで、幅広くかつ詳細に解説していきます。各コマンドについて、構文、説明、引数、戻り値、そして具体的な実行例を交えながら、その使い方を徹底的に掘り下げます。約5000語にわたる解説を通じて、あなたが Redis コマンドを自信を持って扱えるようになることを目指します。

Redis の基本概念

Redis コマンドを学ぶ前に、いくつかの基本的な概念を理解しておきましょう。

キー(Key)と値(Value)

Redis は基本的にキーバリュー型ストアです。全てのデータは一意な キー に関連付けられた として保存されます。

  • キー: バイナリセーフな文字列です。どんなバイナリ列でもキーとして使用できます(ただし、可読性のために人間が理解しやすい文字列を使うのが一般的です)。最大長は512MBですが、通常はもっと短いキーを使用します。
  • : Redis がサポートするデータ構造(文字列、リスト、ハッシュなど)のいずれかになります。

キーは Redis の名前空間を形成し、値を参照するための識別子となります。

データベース(DBインデックス)

Redis サーバーはデフォルトで16個の論理的なデータベース(DBインデックス0から15)を持ちます。各データベースは独立しており、異なるキー空間を持ちます。コマンドで操作するデータベースを選択するには、SELECT コマンドを使用します。デフォルトはDB 0です。

クライアントとサーバーの関係

Redis はクライアント・サーバーモデルで動作します。Redis サーバーを起動し、クライアントプログラム(redis-cli や各種プログラミング言語用のクライアントライブラリ)からサーバーに接続してコマンドを送信します。サーバーはコマンドを受け取り、処理を実行し、結果をクライアントに返します。

Redis コマンドの実行方法

コマンドを実行する最も簡単な方法は、Redis に同梱されているコマンドラインインターフェース redis-cli を使用することです。

redis-cli を起動するとプロンプトが表示されるので、そこに直接コマンドを入力して実行できます。

bash
$ redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET mykey "Hello Redis"
OK
127.0.0.1:6379> GET mykey
"Hello Redis"
127.0.0.1:6379>

本記事では、特に断りがない限り、redis-cli を使用したコマンド実行例を示します。

Redis コマンドのカテゴリ別詳細解説

ここからは、Redis が提供する様々なコマンドをカテゴリ別に詳しく見ていきましょう。

1. キー関連コマンド (Generic Commands)

これらのコマンドは、値の型に関わらず、キーそのものに対して操作を行います。

  • DEL key [key ...]

    • 構文: DEL key [key ...]
    • 説明: 指定されたキーとその値を削除します。複数のキーを一度に指定できます。
    • 引数: 削除したいキー名(1つ以上)。
    • 戻り値: 削除されたキーの数(整数)。キーが存在しない場合は0を返します。
    • 実行例:
      redis
      127.0.0.1:6379> SET mykey "hello"
      OK
      127.0.0.1:6379> SET anotherkey "world"
      OK
      127.0.0.1:6379> DEL mykey anotherkey nonexistingkey
      (integer) 2
      127.0.0.1:6379> GET mykey
      (nil)
    • 注意点: O(N)の計算量ですが、キーが多数ある場合はそれなりに時間がかかる可能性があります。Redis 4.0以降では、バックグラウンドで非同期に削除する UNLINK コマンドが推奨されることがあります。
  • EXISTS key [key ...]

    • 構文: EXISTS key [key ...]
    • 説明: 指定されたキーが Redis に存在するかどうかを確認します。複数のキーを指定した場合、存在するキーの数を返します。
    • 引数: 確認したいキー名(1つ以上)。
    • 戻り値: 存在するキーの数(整数)。
    • 実行例:
      redis
      127.0.0.1:6379> SET mykey "hello"
      OK
      127.0.0.1:6379> EXISTS mykey
      (integer) 1
      127.0.0.1:6379> EXISTS nonexistingkey
      (integer) 0
      127.0.0.1:6379> EXISTS mykey nonexistingkey anotherkey
      (integer) 1 # mykeyのみが存在する場合
  • TYPE key

    • 構文: TYPE key
    • 説明: 指定されたキーに格納されている値のデータ型を返します。
    • 引数: 確認したいキー名。
    • 戻り値: 値の型を示す文字列(”string”, “list”, “hash”, “set”, “zset”, “stream”, “none”)。キーが存在しない場合は “none” を返します。
    • 実行例:
      redis
      127.0.0.1:6379> SET mykey "hello"
      OK
      127.0.0.1:6379> RPUSH mylist "a" "b"
      (integer) 2
      127.0.0.1:6379> HSET myhash field "value"
      (integer) 1
      127.0.0.1:6379> TYPE mykey
      string
      127.0.0.1:6379> TYPE mylist
      list
      127.0.0.1:6379> TYPE myhash
      hash
      127.0.0.1:6379> TYPE nonexistingkey
      none
  • 有効期限関連コマンド

    • Redis では、各キーに有効期限(TTL: Time To Live)を設定できます。期限切れになると、キーは自動的に削除されます。
    • EXPIRE key seconds: キーに秒単位の有効期限を設定します。成功すれば1、失敗すれば0を返します(キーが存在しない場合など)。
    • PEXPIRE key milliseconds: キーにミリ秒単位の有効期限を設定します。
    • EXPIREAT key timestamp: キーにUnixエポック秒での有効期限を設定します。
    • PEXPIREAT key millisecondsTimestamp: キーにUnixエポックミリ秒での有効期限を設定します。
    • TTL key: キーの残り有効期限を秒単位で返します。
      • 正の値: 残り秒数
      • -1: 有効期限が設定されていない
      • -2: キーが存在しない
    • PTTL key: キーの残り有効期限をミリ秒単位で返します。
    • PERSIST key: キーから有効期限を削除し、永続化します。成功すれば1、失敗すれば0を返します。
    • 実行例:
      redis
      127.0.0.1:6379> SET mykey "volatile value"
      OK
      127.0.0.1:6379> EXPIRE mykey 60 # 60秒後に期限切れ
      (integer) 1
      127.0.0.1:6379> TTL mykey # 残り時間を取得
      (integer) 58 # 例
      127.0.0.1:6379> PERSIST mykey # 有効期限を削除
      (integer) 1
      127.0.0.1:6379> TTL mykey
      (integer) -1
      127.0.0.1:6379> GET nonexistingkey
      (nil)
      127.0.0.1:6379> TTL nonexistingkey
      (integer) -2
  • KEYS pattern

    • 構文: KEYS pattern
    • 説明: 指定されたパターンに一致する全てのキーを検索して返します。
      • *: 任意の文字列に一致
      • ?: 任意の一文字に一致
      • [abc]: 角括弧内のいずれか一文字に一致
      • [a-z]: 範囲内のいずれか一文字に一致
      • [^abc]: 角括弧内のいずれにも一致しない一文字に一致
    • 引数: glob形式のパターン文字列。
    • 戻り値: 一致したキー名のリスト。
    • 実行例:
      redis
      127.0.0.1:6379> SET key1 "value1"
      OK
      127.0.0.1:6379> SET key2 "value2"
      OK
      127.0.0.1:6379> SET anotherkey "anothervalue"
      OK
      127.0.0.1:6379> KEYS key*
      1) "key1"
      2) "key2"
      127.0.0.1:6379> KEYS *key*
      1) "key1"
      2) "key2"
      3) "anotherkey"
      127.0.0.1:6379> KEYS ?ey1
      1) "key1"
    • 注意点: KEYS コマンドは プロダクション環境では絶対に使用しないでください。Redis サーバー内の全てのキーをスキャンするため、キーの数が多い場合、サーバーを長時間ブロックし、他のクライアントからのリクエスト処理を停止させてしまう可能性があります。キーの探索には SCAN コマンドを使用してください。
  • SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

    • 構文: SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
    • 説明: カーソルベースのイテレーションを使用して、キー空間を効率的に探索します。サーバーをブロックせず、一度に返す要素数を制御できます。KEYS の安全な代替手段です。
    • 引数:
      • cursor: イテレーションの開始カーソル。最初の呼び出しでは 0 を指定します。次の呼び出しでは、前回のコマンドが返したカーソル値を指定します。
      • MATCH pattern: (オプション) KEYS と同様のパターンに一致するキーのみを返します。
      • COUNT count: (オプション) 各イテレーションでフェッチする要素数のヒント。実際にはこれより多くまたは少なくなることがあります。デフォルトは10です。
      • TYPE type: (オプション) 指定されたデータ型のキーのみを返します。
    • 戻り値: 2要素の配列。最初の要素は次回の SCAN 呼び出しで使用する新しいカーソル(イテレーションが完了した場合は 0)、2番目の要素は現在のイテレーションで見つかったキーのリスト。
    • 実行例:
      redis
      127.0.0.1:6379> SET key1 "v1"
      OK
      127.0.0.1:6379> SET key2 "v2"
      OK
      127.0.0.1:6379> SET key3 "v3"
      OK
      127.0.0.1:6379> SET anotherkey "v4"
      OK
      127.0.0.1:6379> SCAN 0 MATCH key* COUNT 10
      1) "0" # 次のカーソル値 (今回は0、つまりイテレーション完了)
      2) 1) "key1"
      2) "key2"
      3) "key3"
    • 注意点: SCAN はイテレーション中にデータが変更される可能性があるため、返される要素の重複や欠落の可能性があります。正確性を保証する場合は他の方法を検討する必要があります。
  • その他のキー関連コマンド

    • RENAME oldkey newkey: キーの名前を変更します。newkey が既に存在する場合、その値は上書きされます。
    • RENAMENX oldkey newkey: キーの名前を変更します。newkey が既に存在しない場合にのみ変更を行います。
    • RANDOMKEY: 現在のデータベースからランダムにキーを1つ返します。
    • MOVE key db: 指定されたキーを現在のデータベースから指定された別のデータベースへ移動します。
    • OBJECT subcommand [arguments ...]: キーの内部表現に関するデバッグ情報を提供します (REFCOUNT, ENCODING, IDLETIME など)。

2. 文字列(Strings)関連コマンド

Redis の String 型は最も基本的なデータ型です。テキストだけでなく、バイナリデータも保存できます。整数値を格納してアトミックなカウンタとしても使用できます。

  • SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT millisecondsTimestamp|KEEPTTL] [NX|XX] [GET]

    • 構文: SET key value [options]
    • 説明: 指定されたキーに値を設定します。キーが既に存在する場合、以前の値は上書きされます。豊富なオプションを持ちます。
    • 引数:
      • key: 設定するキー名。
      • value: 設定する値。
      • EX seconds: (オプション) 指定秒後に期限切れを設定。
      • PX milliseconds: (オプション) 指定ミリ秒後に期限切れを設定。
      • EXAT timestamp: (オプション) 指定Unixエポック秒で期限切れを設定。
      • PXAT millisecondsTimestamp: (オプション) 指定Unixエポックミリ秒で期限切れを設定。
      • KEEPTTL: (オプション) 有効期限が既に設定されている場合、その期限を保持します。
      • NX: (オプション) キーが 存在しない 場合にのみ設定します。
      • XX: (オプション) キーが 存在する 場合にのみ設定します。
      • GET: (オプション) 新しい値を設定する前に、元の値を返します。
    • 戻り値:
      • オプションがない場合: OK
      • NX または XX を指定し、条件を満たさなかった場合: (nil)
      • GET オプションを指定した場合: 設定前の元の値、または元の値が存在しない場合は (nil)
    • 実行例:
      redis
      127.0.0.1:6379> SET mykey "hello"
      OK
      1227.0.0.1:6379> GET mykey
      "hello"
      127.0.0.1:6379> SET mykey "world" NX # キーが存在するので設定されない
      (nil)
      127.0.0.1:6379> SET newkey "new value" NX # キーが存在しないので設定される
      OK
      127.0.0.1:6379> SET mykey "updated value" XX GET # キーが存在するので設定され、元の値が返される
      "world"
  • GET key

    • 構文: GET key
    • 説明: 指定されたキーに格納されている文字列値を取得します。
    • 引数: 取得したいキー名。
    • 戻り値: キーが存在し、文字列値が格納されている場合、その値。キーが存在しないか、格納されている値が文字列型でない場合、(nil)
    • 実行例:
      redis
      127.0.0.1:6379> SET mykey "hello"
      OK
      127.0.0.1:6379> GET mykey
      "hello"
      127.0.0.1:6379> GET nonexistingkey
      (nil)
  • 原子操作(Increment/Decrement)

    • INCR key: 指定されたキーの値を1増やします。値が存在しない場合は0として扱われます。値は64ビット整数である必要があります。
    • DECR key: 指定されたキーの値を1減らします。
    • INCRBY key increment: 指定されたキーの値を increment だけ増やします。
    • DECRBY key decrement: 指定されたキーの値を decrement だけ減らします。
    • INCRBYFLOAT key increment: 指定されたキーの値を浮動小数点数 increment だけ増やします。
    • 戻り値: 操作後の新しい値(整数または浮動小数点数)。
    • 実行例:
      redis
      127.0.0.1:6379> SET counter 10
      OK
      127.0.0.1:6379> INCR counter
      (integer) 11
      127.0.0.1:6379> DECR counter
      (integer) 10
      127.0.0.1:6379> INCRBY counter 5
      (integer) 15
      127.0.0.1:6379> DECRBY counter 2
      (integer) 13
      127.0.0.1:6379> SET float_counter 1.5
      OK
      127.0.0.1:6379> INCRBYFLOAT float_counter 0.1
      "1.6"
    • 注意点: これらの操作はアトミックです。複数のクライアントが同時に実行しても競合状態は発生しません。
  • その他の文字列操作コマンド

    • APPEND key value: キーの値の末尾に value を追加します。キーが存在しない場合は SET key value と同じ動作になります。
    • GETRANGE key start end: キーの値の指定された範囲のサブ文字列を取得します。インデックスは0から始まります。負のインデックスは文字列の末尾から数えます(-1が最後の文字)。
    • SETRANGE key offset value: キーの値の指定されたオフセットから value で上書きします。必要に応じて値を拡張します。
    • STRLEN key: キーの値の長さを返します。
    • MSET key value [key value ...] : 複数のキーと値を一度に設定します。
    • MGET key [key ...] : 複数のキーの値を一度に取得します。
    • MSETNX key value [key value ...] : 複数のキーと値を一度に設定しますが、指定されたキーのいずれかが既に存在する場合は何も設定しません。
    • ビット操作: SETBIT, GETBIT, BITCOUNT, BITOP などがあります。これらは文字列をビット列として扱い、効率的なビット単位の操作を可能にします。例えば、ユーザーのログイン状態(日ごとのビットマップ)や、特定のイベントが発生したかどうかのフラグ管理などに使用されます。

3. リスト(Lists)関連コマンド

Redis の List 型は、文字列要素のリストを順序付けて保持します。要素はリストの両端(左端/頭、右端/末尾)に対して追加または削除できます。最大約 2^32 – 1 個の要素を保持できます。

  • 要素追加コマンド

    • LPUSH key element [element ...] : 指定された要素をリストの左端(頭)に追加します。複数の要素を指定した場合、左から順に追加されます。
    • RPUSH key element [element ...] : 指定された要素をリストの右端(末尾)に追加します。
    • LPUSHX key element [element ...] : リストが存在する場合にのみ、要素を左端に追加します。
    • RPUSHX key element [element ...] : リストが存在する場合にのみ、要素を右端に追加します。
    • LINSERT key BEFORE|AFTER pivot element : pivot 要素の前後どちらかに element を挿入します。
    • 戻り値: 操作後のリストの長さ(整数)。
    • 実行例:
      redis
      127.0.0.1:6379> RPUSH mylist "a" "b" "c"
      (integer) 3 # リスト: ["a", "b", "c"]
      127.0.0.1:6379> LPUSH mylist "x" "y"
      (integer) 5 # リスト: ["y", "x", "a", "b", "c"]
      127.0.0.1:6379> LINSERT mylist AFTER "x" "z"
      (integer) 6 # リスト: ["y", "x", "z", "a", "b", "c"]
  • 要素取得/削除コマンド

    • LPOP key [count] : リストの左端から要素を取り除き、その要素を返します。Redis 5.0以降では count を指定して複数要素を取り除けます。
    • RPOP key [count] : リストの右端から要素を取り除き、その要素を返します。
    • LREM key count element : リストから指定された elementcount の絶対値の数だけ削除します。count > 0 の場合は左から、count < 0 の場合は右から削除します。count = 0 の場合は全て削除します。
    • LTRIM key start stop : リストを、指定された範囲の要素のみが残るように切り詰めます。インデックスは0から始まり、負のインデックスも使用できます。
    • LINDEX key index : リストの指定されたインデックスの要素を取得します。
    • LRANGE key start stop : リストの指定された範囲の要素を取得します。
    • 戻り値: 取り除かれた要素、削除された要素数、切り詰め後のリスト要素、取得した要素/要素リストなど。
    • 実行例:
      redis
      127.0.0.1:6379> RPUSH mylist "a" "b" "c" "a" "b" "a"
      (integer) 6 # リスト: ["a", "b", "c", "a", "b", "a"]
      127.0.0.1:6379> LPOP mylist
      "a" # リスト: ["b", "c", "a", "b", "a"]
      127.0.0.1:6379> RPOP mylist
      "a" # リスト: ["b", "c", "a", "b"]
      127.0.0.1:6379> LREM mylist 2 "b" # 左から2個の"b"を削除
      (integer) 2 # リスト: ["c", "a"]
      127.0.0.1:6379> LRANGE mylist 0 -1 # 全要素を取得
      1) "c"
      2) "a"
      127.0.0.1:6379> LTRIM mylist 1 1 # インデックス1から1までを残す
      OK # リスト: ["a"]
  • ブロック操作コマンド (メッセージキュー応用)

    • BLPOP key [key ...] timeout : 1つ以上のリストから、空でないリストが見つかるまでブロック(待機)します。見つかった場合、そのリストの左端から要素を取り除き、リスト名と要素を返します。タイムアウトが発生した場合は (nil) を返します。
    • BRPOP key [key ...] timeout : BLPOP の右端バージョンです。
    • 実行例:
      “`redis
      # 別々のクライアントで実行を想定

      クライアント1 (待機)

      127.0.0.1:6379> BLPOP mylist anotherlist 10 # mylistかanotherlistに要素が入るか10秒待つ

      (ブロック中)

      クライアント2 (要素を追加)

      127.0.0.1:6379> RPUSH mylist “message1”
      (integer) 1

      クライアント1 (要素を取得)

      1) “mylist” # 要素が追加されたリスト名

      2) “message1” # 取り出された要素

      “`
      * 注意点: これらのコマンドは、Redis をシンプルなメッセージキューとして利用する際に非常に有用です。

  • その他のリスト関連コマンド

    • LLEN key: リストの長さ(要素数)を返します。
    • RPOPLPUSH source destination : source リストの右端から要素を取り除き、その要素を destination リストの左端に追加します。アトミックな操作です。
    • BRPOPLPUSH source destination timeout : RPOPLPUSH のブロックバージョンです。
    • LMOVE source destination LEFT|RIGHT LEFT|RIGHT (Redis 6.0以降) : source リストから要素を取り除き (LEFT または RIGHT)、その要素を destination リストに追加 (LEFT または RIGHT) します。より柔軟な要素移動コマンドです。
    • BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout (Redis 6.0以降) : LMOVE のブロックバージョンです。

4. ハッシュ(Hashes)関連コマンド

Redis の Hash 型は、フィールド(Field)と値(Value)のペアを多数格納できるデータ型です。オブジェクトのように、複数の属性をまとめて1つのキーの下に格納するのに適しています。最大約 2^32 – 1 個のフィールドを持つことができます。

  • フィールド操作コマンド

    • HSET key field value [field value ...] : 指定されたハッシュキーの指定されたフィールドに値を設定します。フィールドが既に存在する場合は上書き、存在しない場合は新規作成します。複数のフィールドと値を一度に設定できます。Redis 4.0以降では、以前の HMSET の代わりに推奨されます。
    • HGET key field : 指定されたハッシュキーの指定されたフィールドの値を取得します。
    • HDEL key field [field ...] : 指定されたハッシュキーから指定されたフィールドを削除します。複数のフィールドを指定できます。
    • HEXISTS key field : 指定されたハッシュキーに指定されたフィールドが存在するかどうかを確認します。
    • HSTRLEN key field : 指定されたハッシュキーの指定されたフィールドの値の長さを返します。
    • 戻り値: 設定されたフィールド数、取得した値、削除されたフィールド数、存在確認結果(0または1)、値の長さなど。
    • 実行例:
      redis
      127.0.0.1:6379> HSET user:100 name "Alice" age 30 city "New York"
      (integer) 3 # 3つのフィールドが追加された
      127.0.0.1:6379> HGET user:100 name
      "Alice"
      127.0.0.1:6379> HEXISTS user:100 email
      (integer) 0
      127.0.0.1:6379> HDEL user:100 city
      (integer) 1
      127.0.0.1:6379> HGET user:100 city
      (nil)
  • 複数フィールド操作コマンド

    • HMGET key field [field ...] : 指定されたハッシュキーから複数のフィールドの値を一度に取得します。
    • HGETALL key : 指定されたハッシュキーの全てのフィールドと値をまとめて取得します。
      • 注意点: HGETALL はハッシュ内の全ての要素を返すため、ハッシュが大きい場合はパフォーマンスに影響を与える可能性があります。大量のデータを取得する場合は、後述の HSCAN を使用するか、必要なフィールドだけを HMGET で取得することを検討してください。
    • 戻り値: フィールドと値のリスト (HGETALL)、値のリスト (HMGET)。
    • 実行例:
      redis
      127.0.0.1:6379> HSET user:101 name "Bob" job "Engineer"
      (integer) 2
      127.0.0.1:6379> HMGET user:101 name job email
      1) "Bob"
      2) "Engineer"
      3) (nil)
      127.0.0.1:6379> HGETALL user:101
      1) "name"
      2) "Bob"
      3) "job"
      4) "Engineer"
  • キー/値一覧コマンド

    • HKEYS key : 指定されたハッシュキーの全てのフィールド名をリストで返します。
    • HVALS key : 指定されたハッシュキーの全ての値をリストで返します。
    • 戻り値: フィールド名のリスト、または値のリスト。
    • 実行例:
      redis
      127.0.0.1:6379> HSET user:102 name "Charlie" age 25
      (integer) 2
      127.0.0.1:6379> HKEYS user:102
      1) "name"
      2) "age"
      127.0.0.1:6379> HVALS user:102
      1) "Charlie"
      2) "25"
  • ハッシュ長コマンド

    • HLEN key : 指定されたハッシュキーのフィールド数(キーバリューペアの数)を返します。
  • 数値操作コマンド

    • HINCRBY key field increment : 指定されたハッシュキーの指定されたフィールドの値を increment だけ増やします。フィールドが存在しない場合は0として扱われます。値は64ビット整数である必要があります。
    • HINCRBYFLOAT key field increment : 指定されたハッシュキーの指定されたフィールドの値を浮動小数点数 increment だけ増やします。
    • 戻り値: 操作後の新しい値。
    • 実行例:
      redis
      127.0.0.1:6379> HSET stats login_count 100
      (integer) 1
      127.0.0.1:6379> HINCRBY stats login_count 1
      (integer) 101
      127.0.0.1:6379> HSET stats session_duration 0.5
      (integer) 1
      127.0.0.1:6379> HINCRBYFLOAT stats session_duration 0.2
      "0.7"
  • HSCAN key cursor [MATCH pattern] [COUNT count]

    • 構文: HSCAN key cursor [MATCH pattern] [COUNT count]
    • 説明: ハッシュ内のフィールドと値をカーソルベースで探索します。SCAN コマンドのハッシュバージョンです。ハッシュが大きい場合の安全な探索手段です。
    • 戻り値: 2要素の配列。最初の要素は次回のカーソル、2番目の要素はフィールドと値のペアのリスト。
    • 実行例:
      redis
      127.0.0.1:6379> HSET myhash field1 v1 field2 v2 field3 v3 anotherfield av4
      (integer) 4
      127.0.0.1:6379> HSCAN myhash 0 MATCH field* COUNT 10
      1) "0"
      2) 1) "field1"
      2) "v1"
      3) "field2"
      4) "v2"
      5) "field3"
      6) "v3"

5. セット(Sets)関連コマンド

Redis の Set 型は、文字列要素のユニークで順序付けされていないコレクションです。重複する要素は格納されません。集合演算(和集合、差集合、積集合)を高速に実行できます。最大約 2^32 – 1 個の要素を保持できます。

  • 要素追加/削除コマンド

    • SADD key member [member ...] : 指定された要素をセットに追加します。既に追加されている要素は無視されます。
    • SREM key member [member ...] : 指定された要素をセットから削除します。存在しない要素は無視されます。
    • SMOVE source destination member : source セットから指定された要素を取り除き、destination セットに追加します。
    • 戻り値: 追加された新しい要素の数 (SADD)、削除された要素の数 (SREM)、移動が成功したかどうかのフラグ (SMOVE)。
    • 実行例:
      redis
      127.0.0.1:6379> SADD myset "a" "b" "c" "a" # "a"は重複するので無視
      (integer) 3 # セット: {"a", "b", "c"}
      127.0.0.1:6379> SREM myset "c" "d" # "d"は存在しないので無視
      (integer) 1 # セット: {"a", "b"}
      127.0.0.1:6379> SADD anotherset "b" "e"
      (integer) 2 # anotherセット: {"b", "e"}
      127.0.0.1:6379> SMOVE myset anotherset "b" # "b"をmysetからanothersetへ移動
      (integer) 1 # myset: {"a"}, anotherset: {"b", "e"}
  • 要素確認コマンド

    • SISMEMBER key member : 指定された要素がセットのメンバーであるかどうかを確認します。
    • SMEMBERS key : セットの全てのメンバーをリストで返します。
      • 注意点: SMEMBERS はセットが大きい場合はパフォーマンスに影響を与える可能性があります。大量のデータを取得する場合は、後述の SSCAN を使用してください。
    • 戻り値: メンバーである場合は1、そうでない場合は0 (SISMEMBER)。メンバーのリスト (SMEMBERS)。
    • 実行例:
      redis
      127.0.0.1:6379> SADD myset "a" "b" "c"
      (integer) 3
      127.0.0.1:6379> SISMEMBER myset "a"
      (integer) 1
      127.0.0.1:6379> SISMEMBER myset "d"
      (integer) 0
      127.0.0.1:6379> SMEMBERS myset # 返される順序は不定
      1) "a"
      2) "b"
      3) "c"
  • セット演算コマンド

    • SINTER key [key ...] : 指定された全てのセットの積集合(共通要素)を返します。
    • SUNION key [key ...] : 指定された全てのセットの和集合(全ての要素)を返します。
    • SDIFF key [key ...] : 最初のセットから、それ以降の全てのセットに含まれる要素を取り除いた差集合を返します。
    • SINTERSTORE destination key [key ...] : 積集合を計算し、結果を destination という新しいキーのセットとして保存します。
    • SUNIONSTORE destination key [key ...] : 和集合を計算し、結果を保存します。
    • SDIFFSTORE destination key [key ...] : 差集合を計算し、結果を保存します。
    • 戻り値: 演算結果のメンバーリスト、または結果セットの要素数 (*STORE コマンド)。
    • 実行例:
      redis
      127.0.0.1:6379> SADD set1 "a" "b" "c"
      (integer) 3
      127.0.0.1:6379> SADD set2 "c" "d" "e"
      (integer) 3
      127.0.0.1:6379> SINTER set1 set2 # 積集合
      1) "c"
      127.0.0.1:6379> SUNION set1 set2 # 和集合
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      5) "e"
      127.0.0.1:6379> SDIFF set1 set2 # set1 - set2
      1) "a"
      2) "b"
      127.0.0.1:6379> SINTERSTORE set1_inter_set2 set1 set2
      (integer) 1
      127.0.0.1:6379> SMEMBERS set1_inter_set2
      1) "c"
  • その他のセット関連コマンド

    • SRANDMEMBER key [count] : セットからランダムに1つ以上の要素を返します。count を指定すると複数返せますが、デフォルトでは重複なし、負の count を指定すると重複ありで返します。セットの要素は削除しません。
    • SPOP key [count] : セットからランダムに1つ以上の要素を取り除き、その要素を返します。
    • SCARD key : セットの要素数(カーディナリティ)を返します。
    • SSCAN key cursor [MATCH pattern] [COUNT count] : セット内の要素をカーソルベースで探索します。SCAN コマンドのセットバージョンです。

6. ソート済みセット(Sorted Sets / ZSETs)関連コマンド

Redis の Sorted Set 型は、文字列要素と、それに対応する浮動小数点数であるスコアのペアを保持します。要素はスコアによって昇順にソートされます。スコアが同じ場合は、要素の文字列値の辞書順でソートされます。ユニークなメンバーのみが格納されます。リーダーボードの実装などに非常に適しています。最大約 2^32 – 1 個のメンバーを保持できます。

  • 要素追加/削除/スコア操作コマンド

    • ZADD key [NX|XX|GT|LT] [CH] [INCR] score member [score member ...] : 指定されたスコアとメンバーをソート済みセットに追加します。メンバーが既に存在する場合はスコアを更新します。豊富なオプションを持ちます(NX: 存在しない場合のみ追加、XX: 存在する場合のみ更新、GT/LT: 新しいスコアが古いスコアより大きい/小さい場合のみ更新、CH: 追加/更新された要素数だけでなく、スコアが変更された要素数も返す、INCR: 指定されたスコア分だけ既存スコアを増やす)。
    • ZREM key member [member ...] : 指定されたメンバーをソート済みセットから削除します。
    • ZSCORE key member : 指定されたメンバーのスコアを取得します。
    • ZINCRBY key increment member : 指定されたメンバーのスコアを increment だけ増やします。メンバーが存在しない場合はスコア0として扱われます。
    • 戻り値: 追加/更新されたメンバー数 (ZADD)、削除されたメンバー数 (ZREM)、取得したスコア (ZSCORE)、更新後のスコア (ZINCRBY)。
    • 実行例:
      redis
      127.0.0.1:6379> ZADD myzset 1 "one" 2 "two" 3 "three"
      (integer) 3 # ZSET: {"one": 1, "two": 2, "three": 3}
      127.0.0.1:6379> ZADD myzset 1.5 "one and half" 2 "two" # "two"はスコア更新
      (integer) 1 # ZSET: {"one": 1, "one and half": 1.5, "two": 2, "three": 3} (表示順はスコア順)
      127.0.0.1:6379> ZREM myzset "one"
      (integer) 1 # ZSET: {"one and half": 1.5, "two": 2, "three": 3}
      127.0.0.1:6379> ZSCORE myzset "two"
      "2"
      127.0.0.1:6379> ZINCRBY myzset 5 "two"
      "7" # ZSET: {"one and half": 1.5, "three": 3, "two": 7}
  • 要素取得(範囲指定)コマンド

    • スコアまたはランク(順位)に基づいて範囲内のメンバーを取得できます。ランクは0から始まります。
    • ZRANGE key start stop [WITHSCORES] : ランク start から stop までのメンバーをスコア昇順で取得します。WITHSCORES オプションでスコアも取得できます。
    • ZREVRANGE key start stop [WITHSCORES] : ランク start から stop までのメンバーをスコア降順で取得します。
    • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] : スコアが min 以上 max 以下のメンバーをスコア昇順で取得します。範囲は ( で排他的に指定できます (例: (10 は10より大きい)。+inf, -inf で無限を指定できます。LIMIT で結果をページングできます。
    • ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] : スコアが min 以上 max 以下のメンバーをスコア降順で取得します。maxmin の順序に注意してください。
    • ZRANGEBYLEX key min max [LIMIT offset count] : スコアが同じメンバー間で、辞書式順序に基づいて範囲内のメンバーを取得します。範囲は [ で包含、( で排他的、+, - で無限を指定できます。
    • ZREVRANGEBYLEX key max min [LIMIT offset count] : ZRANGEBYLEX の降順バージョンです。
    • 戻り値: 範囲内のメンバーリスト(WITHSCORES オプションがある場合はメンバーとスコアのペアリスト)。
    • 実行例:
      redis
      127.0.0.1:6379> ZADD myzset 1 "a" 2 "b" 3 "c" 4 "d" 5 "e"
      (integer) 5 # ZSET: {"a":1, "b":2, "c":3, "d":4, "e":5}
      127.0.0.1:6379> ZRANGE myzset 0 2 # ランク0から2まで
      1) "a"
      2) "b"
      3) "c"
      127.0.0.1:6379> ZRANGE myzset 0 2 WITHSCORES
      1) "a"
      2) "1"
      3) "b"
      4) "2"
      5) "c"
      6) "3"
      127.0.0.1:6379> ZREVRANGE myzset 0 2 # ランク0から2まで(降順)
      1) "e"
      2) "d"
      3) "c"
      127.0.0.1:6379> ZRANGEBYSCORE myzset 2 4 # スコア2から4まで(昇順)
      1) "b"
      2) "c"
      3) "d"
      127.0.0.0:6379> ZRANGEBYSCORE myzset (2 4 # スコア2より大きく4以下
      1) "c"
      2) "d"
  • 要素数/範囲数コマンド

    • ZCARD key : ソート済みセットのメンバー数を返します。
    • ZCOUNT key min max : スコアが min 以上 max 以下のメンバー数を返します。
    • ZLEXCOUNT key min max : スコアが同じメンバー間で、指定された辞書式順序範囲内のメンバー数を返します。
  • ランク取得コマンド

    • ZRANK key member : 指定されたメンバーのスコア昇順でのランク(0から始まるインデックス)を返します。
    • ZREVRANK key member : 指定されたメンバーのスコア降順でのランクを返します。
    • 戻り値: メンバーのランク(整数)。メンバーが存在しない場合は (nil)
  • 集合演算 (*STORE コマンド)

    • ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] : 指定されたソート済みセットの積集合を計算し、結果を destination という新しいキーのソート済みセットとして保存します。複数のセットで共通するメンバーのスコアは、WEIGHTS オプションで指定された重みを付けて集計 (AGGREGATE) できます。
    • ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] : 和集合を計算し、結果を保存します。
    • ZDIFFSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] (Redis 6.2以降) : 差集合を計算し、結果を保存します。
    • 戻り値: 結果ソート済みセットのメンバー数。
  • その他のソート済みセット関連コマンド

    • ZSCAN key cursor [MATCH pattern] [COUNT count] : ソート済みセット内のメンバーをカーソルベースで探索します。
    • ZPOPMAX key [count], ZPOPMIN key [count] (Redis 5.0以降) : スコア最大/最小のメンバーを指定数だけ取り除き、そのメンバーとスコアを返します。
    • BZPOPMAX key [key ...] timeout, BZPOPMIN key [key ...] timeout (Redis 5.0以降) : ZPOPMAX/ZPOPMIN のブロックバージョンです。空でないソート済みセットが見つかるまで待機します。
    • ZMSCORE key member [member ...] (Redis 6.2以降) : 複数のメンバーのスコアを一度に取得します。

7. HyperLogLog 関連コマンド

HyperLogLog は、セットのカーディナリティ(ユニークな要素の数)を概算するための確率的データ構造です。非常に少ないメモリ量で、大規模なセットの要素数を高い精度で推定できます。誤差は通常1%未満です。

  • PFADD key element [element ...] : 指定された要素を HyperLogLog に追加します。カーディナリティが増加した場合は1、変更がなかった場合は0を返します。
  • PFCOUNT key [key ...] : 1つ以上の HyperLogLog に含まれるユニークな要素の概算数を返します。複数のキーを指定した場合は、全ての HyperLogLog をマージした際の概算数を返します。
  • PFMERGE destkey sourcekey [sourcekey ...] : 複数の HyperLogLog をマージし、結果を destkey に保存します。
  • 実行例:
    redis
    127.0.0.1:6379> PFADD myhll "apple" "banana" "cherry" "apple"
    (integer) 1 # カーディナリティが増加した
    127.0.0.1:6379> PFCOUNT myhll
    (integer) 3 # 概算数は3
    127.0.0.1:6379> PFADD anotherhll "cherry" "date"
    (integer) 1
    127.0.0.1:6379> PFMERGE mergedhll myhll anotherhll
    OK
    127.0.0.1:6379> PFCOUNT mergedhll
    (integer) 4 # "apple", "banana", "cherry", "date" の4つ
  • 注意点: あくまで概算であり、正確な数を必要とする場合は使用しないでください。

8. Geospatial 関連コマンド (Redis 3.2以降)

Redis の Geospatial インデックスは、緯度経度情報を格納し、指定した地点からの距離検索や範囲検索を効率的に行うための機能です。ソート済みセットを内部的に使用しています。

  • GEOADD key longitude latitude member [longitude latitude member ...] : 指定された経度、緯度、メンバー(位置情報の名前)をジオ空間インデックスに追加します。
  • GEOPOS key member [member ...] : 指定されたメンバーの位置情報(経度と緯度)を取得します。
  • GEODIST key member1 member2 [unit] : 2つのメンバー間の距離を計算します。unit は以下のいずれかです: m (メートル), km (キロメートル), mi (マイル), ft (フィート)。デフォルトはメートルです。
  • GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] (非推奨, GEOSEARCH 推奨) : 指定された経度、緯度を中心とした指定半径内のメンバーを検索します。
  • GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] (非推奨, GEOSEARCH 推奨) : 指定されたメンバーを中心とした指定半径内のメンバーを検索します。
  • GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius m|km|ft|mi|BYBOX width height m|km|ft|mi [NOCROSSAXIS] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] (Redis 6.2以降) : より柔軟なジオ空間検索コマンドです。特定のメンバーまたは座標を中心とした半径またはボックス内のメンバーを検索できます。
  • GEOSEARCHSTORE destkey sourcekey FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius m|km|ft|mi|BYBOX width height m|km|ft|mi [NOCROSSAXIS] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] (Redis 6.2以降) : GEOSEARCH の結果を新しいキーに保存します。
  • 実行例:
    redis
    127.0.0.1:6379> GEOADD cities 13.900000 35.683333 "Tokyo" 2.350000 48.866667 "Paris" 12.483333 41.900000 "Rome"
    (integer) 3 # 3つの都市を追加
    127.0.0.1:6379> GEOPOS cities "Tokyo" "Rome"
    1) 1) "13.89999860525131206" # Tokyoの経度
    2) "35.683334757916381" # Tokyoの緯度
    2) 1) "12.48333365619182587" # Romeの経度
    2) "41.900000177834661" # Romeの緯度
    127.0.0.1:6379> GEODIST cities "Tokyo" "Rome" km
    "985.7345" # 東京-ローマ間のおおよその距離 (km)
    127.0.0.1:6379> GEOSEARCH cities FROMLONLAT 13.900000 35.683333 BYRADIUS 1000 km WITHDIST
    1) 1) "Tokyo"
    2) "0.0000"
    2) 1) "Rome"
    2) "985.7345"
    # 東京から1000km以内の都市を距離付きで検索
  • 注意点: 経度/緯度の順序に注意してください (longitude が先です)。

9. ビットマップ (応用)

文字列型をビット列として扱うことで、ビットマップとして利用できます。特に、大量の要素のOn/Off状態や、特定日のユーザーの行動などを省メモリで記録するのに適しています。

  • SETBIT key offset value : 文字列の指定されたオフセットのビットを0または1に設定します。文字列が必要に応じて拡張されます。
  • GETBIT key offset : 文字列の指定されたオフセットのビットを取得します。
  • BITCOUNT key [start end] : 文字列の指定された範囲(バイト単位)で、セットされているビット(値が1のビット)の数をカウントします。
  • BITOP operation destkey key [key ...] : 指定された複数の文字列に対してビット単位のAND, OR, XOR, NOT演算を行い、結果を destkey に保存します。
  • 実行例:
    redis
    127.0.0.1:6379> SETBIT user_login_20231027 100 1 # ユーザーID 100が10月27日にログインしたことを記録
    (integer) 0 # 元々0だった
    127.0.0.1:6379> SETBIT user_login_20231027 200 1 # ユーザーID 200がログイン
    (integer) 0
    127.0.0.1:6379> SETBIT user_login_20231028 100 1 # ユーザーID 100が10月28日にログイン
    (integer) 0
    127.0.0.1:6379> GETBIT user_login_20231027 100
    (integer) 1 # ユーザー100は10月27日にログインした
    127.0.0.1:6379> BITCOUNT user_login_20231027 # 10月27日にログインしたユニークユーザー数
    (integer) 2
    127.0.0.1:6379> BITOP AND logged_in_both user_login_20231027 user_login_20231028 # 両日ログインしたユーザー
    (integer) 26 # 結果文字列のバイト長 (ビット数は 26*8)
    127.0.0.1:6379> BITCOUNT logged_in_both
    (integer) 1 # ユーザー100のみ両日ログイン
  • 注意点: オフセットはビット単位ですが、BITCOUNT の範囲はバイト単位です。また、大きなオフセットを指定すると、中間バイトが0で埋められてメモリを消費します。

高度なコマンドと機能

Redis は、基本的なデータ操作コマンドに加え、アプリケーション開発を支援する様々な高度な機能を提供しています。

1. トランザクション (Transactions)

Redis トランザクションは、一連のコマンドを単一の原子的な操作として実行することを保証します。つまり、トランザクション内の全てのコマンドが成功するか、または全く実行されないかのどちらかになります。

  • MULTI : トランザクションの開始を宣言します。これ以降に送信されたコマンドは、キューに格納されますが、すぐには実行されません。
  • EXEC : MULTI 以降にキューに格納された全てのコマンドを実行します。
  • DISCARD : MULTI 以降にキューに格納されたコマンドを全て破棄し、トランザクションを中断します。
  • WATCH key [key ...] : EXEC コマンドが実行される前に、指定されたキーが他のクライアントによって変更されていないことを確認します。変更されている場合、トランザクションは中断され、EXEC(nil) を返します。
  • UNWATCH : 全ての WATCH されたキーの監視を解除します。
  • 実行例:
    redis
    127.0.0.1:6379> MULTI # トランザクション開始
    OK
    127.0.0.1:6379> INCR mycounter # キューに格納
    QUEUED
    127.0.0.1:6379> SET mykey "hello" # キューに格納
    QUEUED
    127.0.0.1:6379> EXEC # キューされたコマンドを実行
    1) (integer) 1 # INCR mycounter の結果
    2) OK # SET mykey "hello" の結果

    redis
    # WATCH の例
    127.0.0.1:6379> WATCH mykey
    OK
    127.0.0.1:6379> GET mykey # mykeyの値を取得 (例: "valueA")
    "valueA"
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> SET mykey "new value"
    QUEUED
    127.0.0.1:6379> INCR anotherkey
    QUEUED
    # --- ここで別のクライアントが SET mykey "changed value" を実行 ---
    127.0.0.1:6379> EXEC # mykeyが変更されたためトランザクションは中断
    (nil)
    127.0.0.1:6379> GET mykey # 値は変更されていない
    "changed value" # 別のクライアントによる変更が適用されている
    127.0.0.1:6379> GET anotherkey # INCコマンドも実行されていない
    (nil)
  • 注意点: Redis のトランザクションは、リレーショナルデータベースのようなロールバック機能は持ちません。EXEC が呼び出されると、キュー内の全てのコマンドは実行されます(構文エラーの場合を除く)。コマンド実行時のエラーは、トランザクション自体を中止させるのではなく、そのコマンドのみがエラーを返し、他のコマンドは実行されます。

2. Pub/Sub (Publish/Subscribe)

Redis の Pub/Sub 機能は、メッセージングパターンの Publish/Subscribe モデルを実装します。クライアントは特定のチャンネルを購読(Subscribe)し、他のクライアントはメッセージを特定のチャンネルに発行(Publish)することで、メッセージを非同期にやり取りできます。

  • PUBLISH channel message : 指定された channelmessage を発行します。メッセージを受け取った購読クライアントの数を返します。
  • SUBSCRIBE channel [channel ...] : 1つ以上のチャンネルを購読します。コマンドを実行したクライアントは、購読したチャンネルにメッセージが発行されるとそれを受け取ります。このコマンドはブロッキングモードに入り、購読を解除するまで他のコマンドは受け付けません(別の接続が必要です)。
  • PSUBSCRIBE pattern [pattern ...] : 1つ以上のパターン(glob形式)に一致するチャンネルを購読します。パターンに一致するチャンネルにメッセージが発行されるとそれを受け取ります。
  • UNSUBSCRIBE [channel [channel ...]] : 指定されたチャンネルの購読を解除します。チャンネルを指定しない場合、全ての購読チャンネルが解除されます。
  • PUNSUBSCRIBE [pattern [pattern ...]] : 指定されたパターンの購読を解除します。パターンを指定しない場合、全てのパターン購読が解除されます。
  • 実行例:
    “`redis
    # クライアント1 (購読者)
    127.0.0.1:6379> SUBSCRIBE news updates
    Reading messages… (press Ctrl-C to quit)
    1) “subscribe”
    2) “news”
    3) (integer) 1 # 購読成功の確認

    クライアント2 (発行者)

    127.0.0.1:6379> PUBLISH news “Hello subscribers!”
    (integer) 1 # 1人の購読者(クライアント1)がメッセージを受け取った

    クライアント1 (メッセージ受信)

    1) “message” # メッセージタイプ

    2) “news” # 受信したチャンネル名

    3) “Hello subscribers!” # メッセージ本文

    “`
    * 注意点: Pub/Sub は、クライアントが接続している間のみメッセージを受信できます。メッセージの永続性や配信保証(少なくとも一度、正確に一度など)は提供しません。これらを必要とする場合は、後述の Redis Streams などの別の機能や、専用のメッセージキューシステムを検討してください。

3. スクリプト (Lua スクリプト)

Redis は、サーバーサイドで Lua スクリプトを実行する機能を提供しています。これにより、複数のコマンドをアトミックに実行したり、複雑なロジックをサーバー側で処理したりすることが可能になります。

  • EVAL script numkeys key [key ...] arg [arg ...] : 指定された Lua スクリプトを実行します。スクリプト内の KEYS 配列と ARGV 配列には、それぞれ keyarg が格納されます。
  • EVALSHA sha1 numkeys key [key ...] arg [arg ...] : 事前に SCRIPT LOAD でロードされたスクリプトの SHA1 ハッシュを指定して実行します。ネットワーク帯域幅の節約に役立ちます。
  • SCRIPT LOAD script : 指定された Lua スクリプトをサーバーにロードし、その SHA1 ハッシュを返します。
  • SCRIPT EXISTS sha1 [sha1 ...] : 指定された SHA1 ハッシュのスクリプトがサーバーにロードされているか確認します。
  • SCRIPT FLUSH : サーバーにロードされている全てのスクリプトを削除します。
  • SCRIPT KILL : 現在実行中の書き込みスクリプトを停止します(レプリケーションを破壊する可能性のあるスクリプトを停止するのに使用)。
  • 実行例:
    “`redis
    127.0.0.1:6379> EVAL “return redis.call(‘SET’, KEYS[1], ARGV[1])” 1 mykey “hello_from_script”
    OK
    127.0.0.1:6379> GET mykey
    “hello_from_script”

    127.0.0.1:6379> SCRIPT LOAD “return redis.call(‘GET’, KEYS[1])”
    “c98075725b50f57464c71c8354819234c04033c8” # ロードされたスクリプトのSHA1ハッシュ
    127.0.0.1:6379> EVALSHA c98075725b50f57464c71c8354819234c04033c8 1 mykey
    “hello_from_script”
    ``
    * **注意点**: スクリプトはデフォルトでアトミックに実行されますが、実行時間が長いスクリプトはサーバーをブロックする可能性があります。Redis のシングルスレッドモデルを理解し、スクリプトを短く保つことが重要です。スクリプト内では、
    redis.call()redis.pcall()` を使用して他の Redis コマンドを実行できます。

4. ストリーム (Streams) (Redis 5.0以降)

Redis の Stream 型は、タイムスタンプベースの専用IDを持つエントリ(キーバリューペアのコレクション)を順序付けて保持するデータ構造です。 append-only のログのような性質を持ち、耐久性のあるメッセージキューとして利用できます。

  • XADD key ID field value [field value ...] : 指定されたストリームに新しいエントリを追加します。ID* を指定すると、サーバーが自動的にユニークなIDを生成します。
  • XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] : 1つ以上のストリームからエントリを読み取ります。COUNT で読み取る数を指定できます。BLOCK でブロックモードに入り、新しいエントリが来るかタイムアウトするまで待機できます。ID$ を指定すると、最新のエントリ以降を読み取ります。
  • XRANGE key start end [COUNT count] : 指定されたID範囲のエントリを読み取ります。
  • XLEN key : ストリームの長さを返します。
  • コンシューマーグループ (Consumer Groups): ストリームの重要な機能で、複数のコンシューマーが協調してストリーム内のメッセージを処理できます。
    • XGROUP CREATE key groupname ID [MKSTREAM] [ENTRIESREAD entries_read] : コンシューマーグループを作成します。
    • XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...] : コンシューマーグループを使用してストリームからエントリを読み取ります。読み取ったエントリは「保留中」としてマークされます。
    • XACK key group ID [ID ...] : 保留中のエントリの処理が完了したことを確認(ACK)します。
    • XPENDING key group [start end count] [consumer] : コンシューマーグループの保留中のエントリを表示します。
    • XCLAIM key group consumer min-idle-time ID [ID ...] : 他のコンシューマーが処理に失敗した保留中のエントリを「引き継ぎ」(claim)ます。
    • XAUTOCLAIM key group consumer min-idle-time start [COUNT count] [JUSTID] [IDLE idle-time] : 保留中のエントリを自動的に引き継ぎます。
  • その他のストリーム関連コマンド: XDEL, XTRIM, XINFO など。
  • 実行例:
    redis
    127.0.0.1:6379> XADD mystream * sensor_id 123 temperature 25.5
    "1678881896420-0" # 自動生成されたID
    127.0.0.1:6379> XADD mystream * sensor_id 456 temperature 26.0
    "1678881898112-0"
    127.0.0.1:6379> XRANGE mystream - + # 全てのエントリを取得
    1) 1) "1678881896420-0"
    2) 1) "sensor_id"
    2) "123"
    3) "temperature"
    4) "25.5"
    2) 1) "1678881898112-0"
    2) 1) "sensor_id"
    2) "456"
    3) "temperature"
    4) "26.0"
    127.0.0.1:6379> XREAD COUNT 1 STREAMS mystream 0 # 最初のID (0) 以降から1件読む
    1) 1) "mystream"
    2) 1) 1) "1678881896420-0"
    2) 1) "sensor_id"
    2) "123"
    3) "temperature"
    4) "25.5"
  • 注意点: Streams は比較的新しいデータ型であり、Pub/Sub とは異なるセマンティクス(永続性、コンシューマーグループ)を提供します。どちらを選択するかはユースケースによって異なります。

5. サーバー関連コマンド

Redis サーバー自体の状態確認や設定、永続化、管理を行うためのコマンドです。

  • INFO [section] : サーバーの様々な情報(メモリ使用量、クライアント接続数、永続化の状態、レプリケーション情報など)を取得します。section を指定すると特定のカテゴリの情報のみを取得できます。
  • CONFIG GET parameter : Redis サーバーの設定パラメータの値を取得します。
  • CONFIG SET parameter value : Redis サーバーの設定パラメータの値を実行時に変更します(設定ファイルも更新するには CONFIG REWRITE が必要です)。
  • SAVE : RDBファイルに現在のデータセットを同期的に保存します。サーバーをブロックするため注意が必要です。
  • BGSAVE : RDBファイルに現在のデータセットを非同期的に保存します。子プロセスが実行するためサーバーはブロックされません。
  • BGREWRITEAOF : AOFファイルのリライトを非同期的に開始します。AOFファイルのサイズを最適化します。
  • SHUTDOWN [NOSAVE|SAVE] : サーバーを停止します。SAVE オプション付きでRDBを保存して停止、NOSAVE オプション付きでRDBを保存せずに停止します。
  • MONITOR : サーバーが受信する全てのコマンドをリアルタイムで表示します。デバッグに役立ちますが、大量の出力を生成する可能性があります。
  • SLOWLOG subcommand [argument] : 実行時間が長いコマンドのログを表示/管理します。
    • SLOWLOG GET [count] : 最新の count 件の遅いコマンドログを取得。
    • SLOWLOG LEN : 遅いコマンドログの件数を取得。
    • SLOWLOG RESET : 遅いコマンドログをクリア。
  • PING : サーバーが応答しているか確認します。PONG を返します。
  • ECHO message : 指定されたメッセージを返します。
  • SELECT index : 指定されたデータベース(DBインデックス)を選択します。
  • FLUSHDB [ASYNC] : 現在選択されているデータベースの全てのキーを削除します。
  • FLUSHALL [ASYNC] : サーバー上の全てのデータベースの全てのキーを削除します。
    • 注意点: FLUSHDB および FLUSHALL は、特にプロダクション環境では非常に危険なコマンドです。データを全て削除してしまうため、実行には十分な注意が必要です。Redis 4.0以降では、バックグラウンドで非同期に削除する ASYNC オプションが利用可能です。
  • LASTSAVE : 最後に RDB が正常に保存されたUnixタイムスタンプを返します。
  • ROLE : 現在のインスタンスが master, slave, または sentinel のどの役割を担っているか、および関連情報を返します。
  • COMMAND : サポートされている全てのコマンドとそのメタデータをリストアップします。
  • CLIENT : 接続しているクライアントに関する情報表示や操作を行います(例: CLIENT LIST, CLIENT KILL, CLIENT PAUSE)。

Redis コマンド利用時のベストプラクティスと注意点

Redis コマンドを効果的かつ安全に使用するために、いくつかのベストプラクティスと注意点を理解しておくことが重要です。

  • KEYS コマンドの代替に SCAN を使用する: 前述の通り、KEYS は大きなデータセットでサーバーをブロックする危険があります。キーのパターン検索には必ず SCAN およびそのデータ構造ごとのバージョン (HSCAN, SSCAN, ZSCAN) を使用してください。
  • 大きなキーや大きな集合体 (SMEMBERS, HGETALL など) の操作に注意する: 一度に大量のデータをクライアントに転送するコマンドは、サーバーだけでなくクライアントやネットワークにも負荷をかけます。必要に応じて SCAN や範囲指定コマンド、LIMIT オプションなどを活用して、データを分割して取得することを検討してください。
  • パイプライン化 (Pipeline) を活用する: クライアントからサーバーへコマンドを1つずつ送信し、その応答を待ってから次のコマンドを送信するのは効率が悪いです。パイプライン化は、複数のコマンドをまとめてサーバーに送信し、まとめて応答を受け取ることで、ラウンドトリップタイム(RTT)のオーバーヘッドを削減し、スループットを向上させます。特に多数のコマンドを連続して実行する場合に有効です。
  • トランザクションの適切な使用: 原子性を保証したい一連の操作にトランザクション (MULTI/EXEC) を使用します。ただし、複雑すぎるロジックや長時間かかる処理をトランザクション内で行うと、サーバーをブロックする可能性があるため注意が必要です。複雑な処理には Lua スクリプトを検討してください。
  • Lua スクリプトの注意点: スクリプトはアトミックですが、実行時間の長いスクリプトは他のクライアントをブロックします。スクリプト内では時間のかかるコマンド(例: KEYS)を使用しないように注意してください。また、スクリプトは決定論的である必要があります(時間やランダム性に基づく操作は避ける)。
  • メモリ使用量を監視する: Redis はインメモリデータベースであるため、使用可能なメモリ量に制約されます。INFO memory コマンドなどでメモリ使用量を定期的に監視し、必要に応じてデータを削除したり、メモリ効率の良いデータ構造を選択したり、クラスター構成を検討したりする必要があります。
  • キーの命名規則: 可読性と管理のために、キーには分かりやすい命名規則を適用することをお勧めします。例えば、オブジェクト名:ID:属性名 のように : で区切るのが一般的な慣習です (user:100:profile, product:sku123:price)。
  • 有効期限 (TTL) の活用: キャッシュやセッションなど、一時的なデータには必ず有効期限を設定し、メモリを解放するようにします。
  • Redis のバージョンを把握する: Redis は積極的に開発が進められており、新しいバージョンでは新しいデータ構造やコマンドが追加されたり、既存コマンドにオプションが追加されたりすることがあります。使用している Redis のバージョンが、目的のコマンドをサポートしているか確認してください。公式ドキュメントを参照することが最も確実です。

実践例・ユースケース

学んだコマンドを実際のアプリケーションでどのように活用できるか、いくつかのユースケースを紹介します。

  • キャッシュ: Webページの出力、データベースクエリの結果、計算結果などをキャッシュします。
    • コマンド例: SET key value EX seconds, GET key, DEL key, EXPIRE key seconds
  • セッションストア: ユーザーのセッション情報を保存します。
    • コマンド例: HSET session:ID user_id 123 login_time ..., HGETALL session:ID, EXPIRE session:ID seconds
  • リーダーボード: ゲームやサービスのランキングを実装します。
    • コマンド例: ZADD leaderboard score member, ZSCORE leaderboard member, ZRANK leaderboard member, ZREVRANGE leaderboard 0 9 WITHSCORES
  • キュー/スタック: タスクキューや処理待ちリストを実装します。
    • コマンド例 (キュー): RPUSH task_queue task_data, BLPOP task_queue 0
    • コマンド例 (スタック): LPUSH call_stack data, LPOP call_stack
  • Pub/Sub を使ったリアルタイムシステム: チャットアプリケーション、リアルタイム通知、イベント配信などに利用します。
    • コマンド例: PUBLISH chat:room1 "message", SUBSCRIBE chat:room1
  • カウンタ/レートリミッタ: アクセス回数のカウント、APIコールのレート制限などに利用します。
    • コマンド例: INCR request_count:user:123, EXPIRE request_count:user:123 60 (1分間の制限)
  • ユニーク訪問者数: Webサイトの日ごとのユニーク訪問者数を概算します。
    • コマンド例: PFADD unique_visitors:20231027 user_id1 user_id2 ..., PFCOUNT unique_visitors:20231027
  • Geoロケーションサービス: 位置情報に基づく検索(例: 最寄りの店舗検索)を実装します。
    • コマンド例: GEOADD locations longitude latitude name, GEOSEARCH locations FROMLONLAT lon lat BYRADIUS radius unit WITHDIST
  • 変更フィード/ログシステム: 永続的なメッセージングやイベントログとして使用します。
    • コマンド例: XADD event_stream * field1 value1 ..., XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS event_stream >, XACK event_stream mygroup entry_id

これらのユースケースは Redis コマンドの活用例の一部に過ぎません。Redis の多様なデータ構造とコマンドを組み合わせることで、さらに多くのアプリケーションを効率的に構築できます。

まとめ

本記事では、「Redis コマンド 使い方徹底解説」と題して、Redis の基本的な概念から始め、様々なデータ構造に関連するコマンド、そしてトランザクション、Pub/Sub、スクリプト、ストリームといった高度な機能に関するコマンド、さらにはサーバー管理コマンドに至るまで、幅広く詳細な解説を行いました。

Redis の真の力は、これらのコマンドを理解し、ユースケースに合わせて適切に使い分けることにあります。各データ構造がどのような特性を持ち、どのような操作に強いのかを把握することで、より効率的で堅牢なアプリケーションを開発できるようになります。

約5000語にわたる解説は、Redis コマンドの世界への第一歩となるでしょう。全てのコマンドを一度に覚える必要はありません。まずは基本的なコマンドから始め、必要に応じて本記事や Redis の公式ドキュメントを参照しながら、少しずつ使えるコマンドを増やしていくことをお勧めします。

Redis の学習は、実際に手を動かしてみることが非常に重要です。redis-cli を使ってコマンドを試したり、簡単なスクリプトを書いてみたりすることで、理解が深まります。

Redis は非常に高速かつ多機能なツールであり、現代の多くのシステムで重要な役割を担っています。その強力なコマンド群を習得し、あなたの開発に活かしてください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール