よく使うRedisコマンド集:詳細解説と実践ガイド
はじめに
現代のアプリケーション開発において、高速なデータアクセスは不可欠です。データベースのキャッシュ層、セッション管理、リアルタイム処理など、様々な用途でインメモリデータストアが活用されています。その中でも、Redisは非常に人気があり、多機能かつ高性能なインメモリデータ構造ストアとして広く利用されています。
Redisの強力さは、その多様なデータ構造と、それらを操作するための豊富かつ直感的なコマンド群にあります。String、List、Set、Sorted Set、Hashといった基本的なデータ構造に加え、HyperLogLogやGeo空間インデックスなど、特殊なデータ構造もサポートしており、それぞれのデータ構造に特化した効率的なコマンドが用意されています。
この記事では、Redisを日常的に利用する上で特に頻繁に使用されるコマンドに焦点を当て、それぞれのコマンドについて詳細な説明、基本的な使い方、実践的な応用例、そして注意点などを網羅的に解説します。本記事を通じて、Redisコマンドへの理解を深め、アプリケーション開発におけるRedisの効果的な活用に役立てていただければ幸いです。
Redisコマンドの基本
Redisのコマンドは、基本的に COMMAND key [argument [argument ...]] という形式を取ります。COMMAND は実行したい操作、key は操作の対象となるキー、argument はコマンドに応じた追加の引数です。
Redisのコマンドは全て大文字で表記されることが多いですが、実際には大文字・小文字を区別しません。慣習的に大文字で書くことが一般的です。
コマンドを実行する方法はいくつかあります。
- redis-cli: Redisサーバーに同梱されているコマンドラインインターフェースです。開発中のテストやサーバー管理、簡単な操作に便利です。
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!" - クライアントライブラリ: 各種プログラミング言語(Python, Java, Ruby, PHP, Node.jsなど)向けに提供されているライブラリを通じて、アプリケーションからRedisコマンドを実行します。これがアプリケーション開発における主な使い方です。
キーの命名規則について:
Redisでは、キーにはバイナリセーフな任意の文字列を使用できます(空文字列も含む)。最大サイズは512MBですが、通常はもっと短いキーを使用します。キー名に特定のルールはありませんが、可読性や管理のしやすさを考慮して、以下のような命名規則が推奨されます。
- 区切り文字の使用:
:や.を使って階層構造を表現する。例:user:100:profile,cache:article:50 - 一貫性: 同じ種類のデータには同じパターンを使用する。
- 簡潔さ: キーは短い方がメモリ効率も良く、ネットワーク転送量も減ります。
- 可読性: キー名だけで何を表しているかがわかるようにする。
主要なデータ構造と関連コマンド
Redisが提供する豊富なデータ構造は、様々な種類のデータを効率的に格納・操作するために設計されています。ここでは、それぞれのデータ構造と、それらを操作するための主要なコマンドについて詳しく見ていきます。
1. Strings (文字列)
RedisのString型は、最も基本的なデータ型です。バイナリセーフであり、テキストだけでなく画像やシリアライズされたオブジェクトなども格納できます。文字列、整数、浮動小数点数として扱うことも可能です。
SET key value [expiration] [condition]
- 説明: 指定したキーに文字列の値を設定します。
- 構文:
SET key value - オプション:
EX seconds: 指定した秒数後にキーの有効期限を設定します。PX milliseconds: 指定したミリ秒数後にキーの有効期限を設定します。NX: キーが存在しない場合のみ値を設定します。既に存在する場合は何もしません。(”Not eXists”)XX: キーが存在する場合のみ値を設定します。存在しない場合は何もしません。(”eXists”)KEEPTTL: キーに既存の有効期限がある場合、それを保持します。
- 使用例:
redis
SET username:1 "Alice"
SET session:abcdef123 "user:100" EX 3600 NX # セッション情報を1時間で期限付きで、重複がなければ設定
SET counter:pageviews 0 XX # カウンターが存在する場合のみ0に設定(あまり使われない) - 注意点:
NXとEX(またはPX)を組み合わせることで、単純な分散ロックの実装に使われることがあります。 - 関連コマンド:
GET,MSET,SETNX,SETEX,PSETEX
GET key
- 説明: 指定したキーに格納されている文字列値を取得します。キーが存在しない場合は
nilを返します。キーが文字列型以外の場合はエラーを返します。 - 構文:
GET key - 使用例:
redis
SET greeting "Hello"
GET greeting # => "Hello"
GET non_existent_key # => (nil) - 関連コマンド:
SET,MGET
DEL key [key ...]
- 説明: 指定したキーを削除します。複数のキーを一度に削除できます。存在しないキーを指定してもエラーにはならず、無視されます。削除されたキーの数を返します。
- 構文:
DEL key [key ...] - 使用例:
redis
SET key1 "value1"
SET key2 "value2"
DEL key1 key2 non_existent_key # => 2
GET key1 # => (nil) - 注意点: 非常に多くのキーを一度に
DELすると、サーバーが一時的にブロックされる可能性があります。大量削除が必要な場合は、UNLINK(非ブロッキング削除)やSCANと組み合わせて徐々に削除することを検討してください。 - 関連コマンド:
UNLINK,EXISTS,KEYS
INCR key / DECR key
- 説明: 指定したキーに格納されている数値を1だけ増減させます。キーが存在しない場合は、値を0と見なして操作を行い、1または-1を設定します。値が数値として解釈できない場合はエラーを返します。
- 構文:
INCR key,DECR key - 使用例:
redis
SET counter 10
INCR counter # => 11
DECR counter # => 10
INCR new_counter # => 1 - 応用例: Webサイトのページビューカウンター、リクエストレート制限など。アトミックな操作が必要な場面で非常に役立ちます。
- 関連コマンド:
INCRBY,DECRBY,INCRBYFLOAT
INCRBY key increment / DECRBY key decrement
- 説明: 指定したキーに格納されている数値を、指定した
increment(またはdecrement)の分だけ増減させます。incrementやdecrementは整数である必要があります。 - 構文:
INCRBY key increment,DECRBY key decrement - 使用例:
redis
SET score 100
INCRBY score 50 # => 150
DECRBY score 20 # => 130 - 関連コマンド:
INCR,DECR,INCRBYFLOAT
APPEND key value
- 説明: 指定したキーに格納されている文字列の末尾に、指定した
valueを追記します。キーが存在しない場合は、キーを作成しvalueを値として設定します(これはSETと同じ挙動になります)。値が文字列型以外の場合はエラーを返します。操作後の文字列の長さを返します。 - 構文:
APPEND key value - 使用例:
redis
SET mykey "Hello"
APPEND mykey " World" # => 11 (文字列 "Hello World" の長さ)
GET mykey # => "Hello World"
APPEND anotherkey "Initial" # => 7 - 応用例: ログの蓄積、一時的なバッファリング。
STRLEN key
- 説明: 指定したキーに格納されている文字列値の長さをバイト単位で取得します。キーが存在しない場合は0を返します。キーが文字列型以外の場合はエラーを返します。
- 構文:
STRLEN key - 使用例:
redis
SET mykey "Hello"
STRLEN mykey # => 5
STRLEN non_existent_key # => 0
GETRANGE key start end
- 説明: 指定したキーに格納されている文字列の、指定した範囲のサブ文字列を取得します。
startとendは0ベースのインデックスです。負のインデックスを使用すると、文字列の末尾からのオフセットを指定できます(-1は最後の文字、-2は最後から2番目の文字など)。endは含まれます。 - 構文:
GETRANGE key start end - 使用例:
redis
SET mykey "This is a string"
GETRANGE mykey 0 3 # => "This"
GETRANGE mykey -6 -1 # => "string"
GETRANGE mykey 10 100 # 存在しない範囲を指定しても、存在する範囲までを返す => "string" - 関連コマンド:
SETRANGE(特定の範囲を上書きする)
MSET key value [key value ...] / MGET key [key ...]
- 説明:
MSETは複数のキーと値を一度に設定します。アトミックに実行されます(全て成功するか、何も変更されないか)。MGETは複数のキーの値を一度に取得します。存在しないキーに対応する値はnilになります。 - 構文:
MSET key value [key value ...],MGET key [key ...] - 使用例:
redis
MSET user:1:name "Alice" user:1:age 30 user:2:name "Bob"
MGET user:1:name user:2:name user:3:name # => 1) "Alice", 2) "Bob", 3) (nil) - 応用例: 複数の設定値やユーザー情報を一度に読み書きすることで、ネットワークラウンドトリップを減らしパフォーマンスを向上させる。
2. Lists (リスト)
RedisのList型は、要素が順番に並んだコレクションです。重複した要素を持つことができます。リストの両端(先頭と末尾)に対して高速な操作が可能です。
LPUSH key element [element ...] / RPUSH key element [element ...]
- 説明: リストの左側(先頭)または右側(末尾)に、指定した要素を追加します。複数の要素を指定した場合、
LPUSHは指定した順序とは逆順に先頭に追加されることに注意してください(つまり、指定した最後の要素がリストの最初の要素になる)。RPUSHは指定した順序通りに末尾に追加されます。キーが存在しない場合は、新しいリストを作成して要素を追加します。操作後のリストの長さを返します。 - 構文:
LPUSH key element [element ...],RPUSH key element [element ...] - 使用例:
redis
RPUSH mylist "A" "B" "C" # => 3 (リスト: ["A", "B", "C"])
LPUSH mylist "X" "Y" # => 5 (リスト: ["Y", "X", "A", "B", "C"]) - 関連コマンド:
LPUSHX,RPUSHX(キーが存在する場合のみ追加)
LPOP key / RPOP key
- 説明: リストの左側(先頭)または右側(末尾)から要素を取り出し、リストから削除します。リストが空であるか、キーが存在しない場合は
nilを返します。 - 構文:
LPOP key,RPOP key - 使用例:
redis
RPUSH mylist "A" "B" "C" # => 3 (リスト: ["A", "B", "C"])
LPOP mylist # => "A" (リスト: ["B", "C"])
RPOP mylist # => "C" (リスト: ["B"])
LPOP mylist # => "B" (リスト: [])
LPOP mylist # => (nil) - 応用例: キュー (
RPUSHで追加しLPOPで処理)、スタック (LPUSHで追加しLPOPで処理、またはRPUSHで追加しRPOPで処理)。 - 関連コマンド:
BLPOP,BRPOP(ブロッキングPOP),RPOPLPUSH
LLEN key
- 説明: リストの長さを取得します。キーが存在しない場合は0を返します。キーがリスト型以外の場合はエラーを返します。
- 構文:
LLEN key - 使用例:
redis
RPUSH mylist "A" "B" "C"
LLEN mylist # => 3
LLEN non_existent_key # => 0
LRANGE key start stop
- 説明: リストの指定した範囲の要素を取得します。
startとstopは0ベースのインデックスです。負のインデックスも使用できます。stopは含まれます。startがstopよりも大きい場合や、範囲がリストの実際の範囲を超える場合もエラーにならず、有効な要素のみが返されます。 - 構文:
LRANGE key start stop - 使用例:
redis
RPUSH mylist "A" "B" "C" "D" "E" # リスト: ["A", "B", "C", "D", "E"]
LRANGE mylist 0 2 # => 1) "A", 2) "B", 3) "C"
LRANGE mylist -3 -1 # => 1) "C", 2) "D", 3) "E"
LRANGE mylist 1 -1 # => 1) "B", 2) "C", 3) "D", 4) "E"
LRANGE mylist 0 -1 # リストの全要素 => 1) "A", 2) "B", 3) "C", 4) "D", 5) "E" - 注意点: 長大なリストに対して
LRANGE 0 -1を実行すると、多くのメモリとネットワーク帯域を使用する可能性があります。取得する範囲を適切に制限するか、必要に応じてページネーションを考慮してください。
LINDEX key index
- 説明: リストの指定したインデックスの要素を取得します。インデックスは0ベースです。負のインデックスも使用できます。インデックスが範囲外の場合は
nilを返します。 - 構文:
LINDEX key index - 使用例:
redis
RPUSH mylist "A" "B" "C" # リスト: ["A", "B", "C"]
LINDEX mylist 0 # => "A"
LINDEX mylist 1 # => "B"
LINDEX mylist -1 # => "C"
LINDEX mylist 100 # => (nil)
LREM key count value
- 説明: リストから指定した
valueを持つ要素を削除します。count引数によって削除する方向と数を制御します。count > 0: リストの先頭からcount個まで、valueに一致する要素を削除します。count < 0: リストの末尾から|count|個まで、valueに一致する要素を削除します。count = 0:valueに一致する全ての要素を削除します。
削除された要素の数を返します。
- 構文:
LREM key count value - 使用例:
redis
RPUSH mylist "A" "B" "A" "C" "A" # リスト: ["A", "B", "A", "C", "A"]
LREM mylist 2 "A" # => 2 (先頭から2個の"A"を削除。リスト: ["B", "C", "A"])
RPUSH mylist "A" "B" "A" "C" "A" # 再設定
LREM mylist -1 "A" # => 1 (末尾から1個の"A"を削除。リスト: ["A", "B", "A", "C"])
RPUSH mylist "A" "B" "A" "C" "A" # 再設定
LREM mylist 0 "A" # => 3 (全ての"A"を削除。リスト: ["B", "C"])
LTRIM key start stop
- 説明: リストを、指定したインデックスの範囲にトリム(切り詰め)します。範囲外の要素は削除されます。
startとstopはLRANGEと同じように機能します。リストをキューとして使い、一定数より古い要素を削除するのに便利です。 - 構文:
LTRIM key start stop - 使用例:
redis
RPUSH mylist "A" "B" "C" "D" "E" # リスト: ["A", "B", "C", "D", "E"]
LTRIM mylist 0 2 # OK (リスト: ["A", "B", "C"])
LTRIM mylist 1 -1 # OK (リスト: ["B", "C"]) - 応用例: 固定長コレクション、ログのローテーション。
RPOPLPUSH source destination
- 説明:
sourceリストの末尾から要素を取り出し、それをdestinationリストの先頭に追加します。この操作はアトミックです。sourceとdestinationが同じキーでも機能します(リストをローテーションさせる)。取り出された要素を返します。 - 構文:
RPOPLPUSH source destination - 使用例:
redis
RPUSH queue "job1" "job2" "job3" # queue: ["job1", "job2", "job3"]
RPOPLPUSH queue processing # => "job3" (queue: ["job1", "job2"], processing: ["job3"])
RPOPLPUSH queue processing # => "job2" (queue: ["job1"], processing: ["job2", "job3"]) - 応用例: キュー処理における信頼性の向上(ワーカーが処理中のジョブを別のリストに移動させ、クラッシュ時にリカバリーできるようにする)。
- 関連コマンド:
BRPOPLPUSH(ブロッキング版)
BLPOP key [key ...] timeout / BRPOP key [key ...] timeout
- 説明:
LPOPまたはRPOPのブロッキング版です。指定したキーのリストが空の場合、指定したtimeout秒間ブロックし、要素が追加されるのを待ちます。要素が追加されたら、リストから要素を取り出してクライアントに返します。複数のキーを指定した場合、要素が最初に追加されたキーから取り出します。タイムアウトした場合、または要素が見つからずにタイムアウト時間を経過した場合はnilを返します。timeoutが0の場合は、要素が見つかるまで無期限にブロックします。 - 構文:
BLPOP key [key ...] timeout,BRPOP key [key ...] timeout -
使用例:
“`redis
# クライアント1
BLPOP tasks 0 # tasksリストに要素が追加されるまでブロッククライアント2 (別のコンソールまたはプロセス)
RPUSH tasks “process this” # クライアント1のBLPOPが解除され、”process this”を受け取る
“`
* 応用例: シンプルなメッセージキューシステムの実装。ワーカープロセスがブロッキングPOPで新しいジョブを待ち受ける。
3. Sets (セット)
RedisのSet型は、重複しない文字列のコレクションです。要素の順序は保持されません。要素の追加、削除、存在チェック、集合演算(和集合、積集合、差集合)を非常に高速に行うことができます。
SADD key member [member ...]
- 説明: 指定したキーのSetに、指定したメンバーを追加します。既にSetに存在するメンバーは無視されます。新しく追加されたメンバーの数を返します。キーが存在しない場合は、新しいSetを作成してメンバーを追加します。
- 構文:
SADD key member [member ...] - 使用例:
redis
SADD myset "apple" "banana" "cherry" # => 3 (セット: {"apple", "banana", "cherry"})
SADD myset "banana" "date" # => 1 (セット: {"apple", "banana", "cherry", "date"}) - 応用例: タグ管理、ユーザーが「いいね」したアイテムのリスト、ユニークな訪問者数のカウント(後述のHyperLogLogの方が大規模な場合は適していることもあります)。
SMEMBERS key
- 説明: 指定したキーのSetに含まれる全てのメンバーを取得します。Setの要素数が非常に多い場合、このコマンドは多くのメモリとネットワーク帯域を使用する可能性があります。代替として
SSCANを使用することを検討してください。 - 構文:
SMEMBERS key - 使用例:
redis
SADD myset "apple" "banana" "cherry"
SMEMBERS myset # => 1) "apple", 2) "banana", 3) "cherry" (順序は不定) - 注意点: Setの要素数が多い場合は
SCANファミリーのSSCANを使用する方が、サーバーへの負荷を抑えられます。 - 関連コマンド:
SSCAN
SISMEMBER key member
- 説明: 指定した
memberがSetに存在するかどうかを確認します。存在する場合は1を、存在しない場合は0を返します。キーが存在しない場合も0を返します。 - 構文:
SISMEMBER key member - 使用例:
redis
SADD myset "apple" "banana"
SISMEMBER myset "apple" # => 1
SISMEMBER myset "grape" # => 0
SISMEMBER non_existent_key "something" # => 0 - 応用例: ユーザーの権限チェック、既に処理済みのアイテムの確認、投票済みユーザーの確認。
SCARD key
- 説明: 指定したキーのSetに含まれるメンバーの数を取得します。キーが存在しない場合は0を返します。
- 構文:
SCARD key - 使用例:
redis
SADD myset "apple" "banana" "cherry"
SCARD myset # => 3
SCARD non_existent_key # => 0
SREM key member [member ...]
- 説明: 指定したキーのSetから、指定したメンバーを削除します。存在しないメンバーを指定しても無視されます。実際に削除されたメンバーの数を返します。
- 構文:
SREM key member [member ...] - 使用例:
redis
SADD myset "apple" "banana" "cherry" # セット: {"apple", "banana", "cherry"}
SREM myset "banana" "date" # => 1 ("banana"が削除された。セット: {"apple", "cherry"})
SPOP key [count]
- 説明: Setからランダムに
count個のメンバーを取り出し(デフォルトは1個)、セットから削除します。取り出されたメンバーを返します。Setが空であるか、キーが存在しない場合はnilまたは空のリストを返します。 - 構文:
SPOP key [count] - 使用例:
redis
SADD myset "A" "B" "C" "D" "E"
SPOP myset # => "C" (例; ランダムなので実行ごとに結果は異なる)
SPOP myset 2 # => 1) "A", 2) "E" (例; 残り{"B", "D"}) - 応用例: 抽選、サンプリング、一度だけ使用するトークンの発行。
SUNION key [key ...] / SINTER key [key ...] / SDIFF key [key ...]
- 説明:
SUNION: 指定した複数のSetの和集合(全てのメンバー)を取得します。SINTER: 指定した複数のSetの積集合(全てのSetに存在するメンバー)を取得します。SDIFF: 最初のSetから、それ以降の全てのSetに存在するメンバーを除いた差集合を取得します。
これらのコマンドは結果をクライアントに返しますが、Setとして保存はしません。
- 構文:
SUNION key [key ...],SINTER key [key ...],SDIFF key [key ...] -
使用例:
“`redis
SADD set1 “A” “B” “C”
SADD set2 “C” “D” “E”
SADD set3 “C” “E” “F”SUNION set1 set2 # => 1) “A”, 2) “B”, 3) “C”, 4) “D”, 5) “E” (順序は不定)
SINTER set1 set2 set3 # => 1) “C”
SDIFF set1 set2 # => 1) “A”, 2) “B”
SDIFF set2 set1 # => 1) “D”, 2) “E”
“`
* 応用例: ユーザーの共通の友達を見つける(積集合)、複数のタグが付いたアイテムを検索する(積集合)、特定のユーザーがフォローしているが別のユーザーはフォローしていない人を見つける(差集合)。
SUNIONSTORE destination key [key ...] / SINTERSTORE destination key [key ...] / SDIFFSTORE destination key [key ...]
- 説明:
SUNION,SINTER,SDIFFと同様の集合演算を実行しますが、結果をクライアントに返すのではなく、指定したdestinationキーに新しいSetとして保存します。既存のdestinationキーは上書きされます。結果Setのメンバー数を返します。 - 構文:
SUNIONSTORE destination key [key ...],SINTERSTORE destination key [key ...],SDIFFSTORE destination key [key ...] - 使用例:
redis
SADD set1 "A" "B" "C"
SADD set2 "C" "D" "E"
SINTERSTORE common_members set1 set2 # => 1 (セット common_members: {"C"}) - 応用例: 計算結果をキャッシュしておき、繰り返し利用する場合。
SRANDMEMBER key [count]
- 説明: Setからランダムに
count個のメンバーを取得します。SPOPとは異なり、取得したメンバーはセットから削除されません。countを負の数にすると、指定した数だけ重複を許してメンバーを取得します。 - 構文:
SRANDMEMBER key [count] - 使用例:
redis
SADD myset "A" "B" "C" "D" "E"
SRANDMEMBER myset # => "D" (例; ランダム)
SRANDMEMBER myset 3 # => 1) "A", 2) "C", 3) "E" (例; 3個、削除しない)
SRANDMEMBER myset -5 # => 1) "B", 2) "B", 3) "E", 4) "A", 5) "C" (例; 5個、重複あり) - 応用例: ユーザーにランダムなアイテムを表示する、A/Bテストのグループ分け(削除しない場合)。
4. Sorted Sets (ソート済みセット)
RedisのSorted Set型は、SetとHashの中間のようなデータ構造です。Setと同様に重複しないメンバーのコレクションですが、各メンバーには浮動小数点数のスコアが関連付けられており、このスコアによってメンバーが常にソートされています。スコアによる範囲取得や、辞書順での範囲取得も可能です。
ZADD key score member [score member ...]
- 説明: 指定したキーのSorted Setに、指定したスコアとメンバーを追加します。メンバーが既に存在する場合は、スコアが更新されます。新しく追加されたメンバーの数(スコア更新は含まれない)を返します。キーが存在しない場合は、新しいSorted Setを作成してメンバーを追加します。
- 構文:
ZADD key score member [score member ...] - オプション:
NX: メンバーが存在しない場合のみ追加します。XX: メンバーが存在する場合のみスコアを更新します。CH: 新しく追加されたメンバーだけでなく、スコアが更新されたメンバーもカウントに含めます。INCR: メンバーのスコアを指定した値だけ増減させます。この場合、score memberのペアは1つだけ指定します。ZINCRBYと同様の挙動になります。
- 使用例:
redis
ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie" # ソート済みセット: {"Alice":100, "Charlie":150, "Bob":200}
ZADD leaderboard 250 "Bob" # => 0 (Bobのスコアを更新。セット: {"Alice":100, "Charlie":150, "Bob":250})
ZADD leaderboard 120 "David" NX # => 1 (Davidを追加。セット: {"Alice":100, "David":120, "Charlie":150, "Bob":250}) - 応用例: リーダーボード、優先度付きキュー、スコアによるランキング。
ZRANGE key start stop [WITHSCORES]
- 説明: Sorted Setの、指定したインデックスの範囲のメンバーを取得します。インデックスは0ベースです。スコアが低い順にソートされます。負のインデックスも使用できます。
WITHSCORESオプションを付けると、スコアも一緒に取得できます。 - 構文:
ZRANGE key start stop [WITHSCORES] - 使用例:
redis
ZADD myzset 10 "one" 20 "two" 30 "three" 40 "four" # セット: {"one":10, "two":20, "three":30, "four":40}
ZRANGE myzset 0 1 # => 1) "one", 2) "two"
ZRANGE myzset -2 -1 # => 1) "three", 2) "four"
ZRANGE myzset 0 -1 WITHSCORES # => 1) "one", 2) "10", 3) "two", 4) "20", 5) "three", 6) "30", 7) "four", 8) "40" - 注意点: Redis 6.0以降、
ZRANGEはスコアが低い順です。逆順はZREVRANGEを使用します。Redis 7.0以降、BYSCOREやBYLEXオプション、REVオプションがZRANGEに統合され、より柔軟な範囲取得が可能になりました。古いバージョンではZRANGEBYSCORE,ZRANGEBYLEX,ZREVRANGE,ZREVRANGEBYSCORE,ZREVRANGEBYLEXを使用する必要があります。ここでは汎用的なコマンドとしてZRANGEとZREVRANGEを説明します。
ZREVRANGE key start stop [WITHSCORES]
- 説明:
ZRANGEの逆順版です。スコアが高い順にソートされた状態で、指定したインデックスの範囲のメンバーを取得します。 - 構文:
ZREVRANGE key start stop [WITHSCORES] - 使用例:
redis
ZADD myzset 10 "one" 20 "two" 30 "three" 40 "four"
ZREVRANGE myzset 0 1 # => 1) "four", 2) "three"
ZREVRANGE myzset 0 -1 WITHSCORES # => 1) "four", 2) "40", 3) "three", 4) "30", 5) "two", 6) "20", 7) "one", 8) "10" - 応用例: リーダーボードの上位N名を取得する。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 説明: 指定したスコアの範囲内のメンバーを取得します。
minとmaxはスコアです。デフォルトではスコアが低い順に取得します。範囲指定には閉区間(minとmaxを含む)を使用しますが、開区間を指定するには(をプレフィックスとして付けます。例えば(minはminより大きいことを意味します。無限大を表す-infと+infも使用できます。LIMITオプションで結果のオフセットと数を指定することで、ページネーションが可能です。 - 構文:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] - 使用例:
redis
ZADD myzset 10 "one" 20 "two" 30 "three" 40 "four" 50 "five"
ZRANGEBYSCORE myzset 20 40 # => 1) "two", 2) "three", 3) "four"
ZRANGEBYSCORE myzset (20 40 # => 1) "three", 2) "four" (20を含まない)
ZRANGEBYSCORE myzset -inf +inf WITHSCORES # 全てを取得
ZRANGEBYSCORE myzset 0 100 LIMIT 1 2 # => 1) "two", 2) "three" (20から、30まで) - 関連コマンド:
ZREVRANGEBYSCORE(逆順)
ZSCORE key member
- 説明: 指定したメンバーのスコアを取得します。メンバーが存在しない場合やキーが存在しない場合は
nilを返します。 - 構文:
ZSCORE key member - 使用例:
redis
ZADD leaderboard 100 "Alice" 200 "Bob"
ZSCORE leaderboard "Alice" # => "100"
ZSCORE leaderboard "David" # => (nil)
ZREM key member [member ...]
- 説明: Sorted Setから指定したメンバーを削除します。存在しないメンバーを指定しても無視されます。実際に削除されたメンバーの数を返します。
- 構文:
ZREM key member [member ...] - 使用例:
redis
ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie" # セット: {"Alice":100, "Charlie":150, "Bob":200}
ZREM leaderboard "Bob" "David" # => 1 ("Bob"が削除された。セット: {"Alice":100, "Charlie":150})
ZCARD key
- 説明: Sorted Setに含まれるメンバーの数を取得します。キーが存在しない場合は0を返します。
- 構文:
ZCARD key - 使用例:
redis
ZADD leaderboard 100 "Alice" 200 "Bob"
ZCARD leaderboard # => 2
ZCARD non_existent_key # => 0 - 関連コマンド:
ZCOUNT(スコア範囲内のメンバー数をカウント)
ZCOUNT key min max
- 説明: 指定したスコアの範囲内に含まれるメンバーの数をカウントします。
minとmaxはZRANGEBYSCOREと同じくスコア範囲指定のルールに従います。 - 構文:
ZCOUNT key min max - 使用例:
redis
ZADD myzset 10 "one" 20 "two" 30 "three" 40 "four" 50 "five"
ZCOUNT myzset 20 40 # => 3
ZCOUNT myzset (20 40 # => 2
ZINCRBY key increment member
- 説明: 指定したメンバーのスコアを、指定した
incrementの値だけ増減させます。メンバーが存在しない場合は、スコアをincrementとしてメンバーを追加します。返される値は操作後のメンバーの新しいスコアです。 - 構文:
ZINCRBY key increment member - 使用例:
redis
ZADD leaderboard 100 "Alice"
ZINCRBY leaderboard 50 "Alice" # => "150" (Aliceのスコアが150になる)
ZINCRBY leaderboard 10 "David" # => "10" (Davidがスコア10で追加される) - 応用例: ゲームのスコア更新、投票システム。
ZRANK key member / ZREVRANK key member
- 説明:
ZRANK: スコアが低い順にソートされた状態で、指定したメンバーの0ベースのインデックス(順位)を取得します。ZREVRANK: スコアが高い順にソートされた状態で、指定したメンバーの0ベースのインデックス(順位)を取得します。
メンバーが存在しない場合やキーが存在しない場合はnilを返します。
- 構文:
ZRANK key member,ZREVRANK key member - 使用例:
redis
ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie" # セット: {"Alice":100, "Charlie":150, "Bob":200}
ZRANK leaderboard "Charlie" # => 1 (0:"Alice", 1:"Charlie", 2:"Bob")
ZREVRANK leaderboard "Charlie" # => 1 (0:"Bob", 1:"Charlie", 2:"Alice") - 応用例: リーダーボードで自分の順位を確認する。
5. Hashes (ハッシュ)
RedisのHash型は、フィールドと値のペアを格納するマップのようなデータ構造です。オブジェクトやレコードを表現するのに適しています。各フィールドは一意であり、その値は文字列です。
HSET key field value [field value ...]
- 説明: 指定したキーのHashに、指定したフィールドと値のペアを設定します。フィールドが既に存在する場合は値が更新されます。新しいフィールドとして追加されたフィールドの数を返します。
- 構文:
HSET key field value [field value ...](Redis 4.0以降では複数のペアを指定可能。以前はHMSETを使用) - 使用例:
redis
HSET user:100 name "Alice" age 30 city "New York" # => 3
HSET user:100 city "Los Angeles" # => 0 (cityは既に存在するため更新。新しく追加されたフィールドは0) - 関連コマンド:
HSETNX(フィールドが存在しない場合のみ設定),HMSET(Redis 4.0で非推奨)
HGET key field
- 説明: 指定したキーのHashから、指定したフィールドの値を取得します。フィールドが存在しない場合やキーが存在しない場合は
nilを返します。 - 構文:
HGET key field - 使用例:
redis
HSET user:100 name "Alice" age 30
HGET user:100 name # => "Alice"
HGET user:100 city # => (nil)
HGET non_existent_user name # => (nil) - 関連コマンド:
HMGET(複数フィールド取得)
HMGET key field [field ...]
- 説明: 指定したキーのHashから、複数のフィールドの値を一度に取得します。存在しないフィールドに対応する値は
nilになります。 - 構文:
HMGET key field [field ...] - 使用例:
redis
HSET user:100 name "Alice" age 30 city "New York"
HMGET user:100 name age address # => 1) "Alice", 2) "30", 3) (nil) - 応用例: ユーザープロファイルの一部を一度に読み込む。
HGETALL key
- 説明: 指定したキーのHashに含まれる全てのフィールドと値を取得します。フィールド名と値が交互に並んだリストとして返されます。Hashのフィールド数が非常に多い場合、このコマンドは多くのメモリとネットワーク帯域を使用する可能性があります。代替として
HSCANを使用することを検討してください。 - 構文:
HGETALL key - 使用例:
redis
HSET user:100 name "Alice" age 30 city "New York"
HGETALL user:100 # => 1) "name", 2) "Alice", 3) "age", 4) "30", 5) "city", 6) "New York" - 注意点: Hashのフィールド数が多い場合は
SCANファミリーのHSCANを使用する方が、サーバーへの負荷を抑えられます。 - 関連コマンド:
HKEYS,HVALS,HSCAN
HDEL key field [field ...]
- 説明: 指定したキーのHashから、指定したフィールドを削除します。複数のフィールドを一度に削除できます。存在しないフィールドを指定しても無視されます。削除されたフィールドの数を返します。
- 構文:
HDEL key field [field ...] - 使用例:
redis
HSET user:100 name "Alice" age 30 city "New York"
HDEL user:100 age address # => 1 ("age"が削除された)
HGETALL user:100 # => 1) "name", 2) "Alice", 3) "city", 4) "New York"
HEXISTS key field
- 説明: 指定したフィールドがHashに存在するかどうかを確認します。存在する場合は1を、存在しない場合は0を返します。キーが存在しない場合も0を返します。
- 構文:
HEXISTS key field - 使用例:
redis
HSET user:100 name "Alice" age 30
HEXISTS user:100 name # => 1
HEXISTS user:100 city # => 0
HLEN key
- 説明: 指定したキーのHashに含まれるフィールドの数を取得します。キーが存在しない場合は0を返します。
- 構文:
HLEN key - 使用例:
redis
HSET user:100 name "Alice" age 30 city "New York"
HLEN user:100 # => 3
HLEN non_existent_key # => 0
HKEYS key / HVALS key
- 説明:
HKEYS: Hashの全てのフィールド名を取得します。HVALS: Hashの全ての値を取得します。
これらのコマンドもHGETALLと同様、大きなHashに対して実行するとパフォーマンスに影響を与える可能性があります。HSCANの使用を検討してください。
- 構文:
HKEYS key,HVALS key - 使用例:
redis
HSET user:100 name "Alice" age 30 city "New York"
HKEYS user:100 # => 1) "name", 2) "age", 3) "city" (順序は不定)
HVALS user:100 # => 1) "Alice", 2) "30", 3) "New York" (順序は不定) - 関連コマンド:
HSCAN
HINCRBY key field increment / HINCRBYFLOAT key field increment
- 説明: 指定したHashの、指定したフィールドの値を
increment分だけ増減させます。HINCRBYは整数、HINCRBYFLOATは浮動小数点数を扱います。フィールドが存在しない場合は、値を0と見なして操作を行い、incrementを設定します。値が数値として解釈できない場合はエラーを返します。操作後のフィールドの新しい値を返します。 - 構文:
HINCRBY key field increment,HINCRBYFLOAT key field increment - 使用例:
redis
HSET user:100 views 10
HINCRBY user:100 views 5 # => 15
HSET user:100 rating 4.5
HINCRBYFLOAT user:100 rating 0.1 # => "4.6" - 応用例: ユーザーごとのカウンター、商品の在庫管理、評価点数の集計。
キー操作コマンド (Key Commands)
データ型に関わらず、Redisのキー自体を操作するためのコマンドです。
KEYS pattern
- 説明: 指定したパターンに一致する全てのキー名を取得します。パターンにはワイルドカード(
*: 任意文字列,?: 任意1文字,[]: 文字集合)を使用できます。 - 構文:
KEYS pattern - 使用例:
redis
SET user:1:name "Alice"
SET user:2:name "Bob"
SET product:100:price 50
KEYS user:* # => 1) "user:1:name", 2) "user:2:name" (順序は不定)
KEYS *:name # => 1) "user:1:name", 2) "user:2:name"
KEYS * # => 全てのキー - 注意点:
KEYSコマンドは、全てのキーをスキャンするため、キーの数が多い本番環境で実行すると、Redisサーバーが一時的にブロックされ、他のクライアントの応答が遅延する可能性があります。本番環境ではKEYSコマンドの使用は極力避け、代わりにSCANコマンドを使用してください。
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
- 説明:
KEYSコマンドの非ブロッキングな代替手段です。カーソルベースのイテレーションによって、サーバーをブロックせずに少しずつキーを取得できます。cursorは前回のコマンドで返されたカーソル値(初回は0)を指定します。MATCHオプションでパターンを指定できます。COUNTオプションはヒントであり、返される要素数は保証されませんが、スキャン速度の調整に使われます。TYPEオプションで特定のデータ型のキーのみをスキャンできます。コマンドは新しいカーソル値と、取得したキーのリストを返します。新しいカーソル値が0になったらスキャンは完了です。 - 構文:
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] -
使用例:
“`redis
# 初回スキャン
SCAN 0 MATCH user:* COUNT 10 # => 1) “15”, 2) 1) “user:1:name”, 2) “user:2:name”, … (カーソル値とキーのリスト)次のスキャン (前回のカーソル値15を使用)
SCAN 15 MATCH user:* COUNT 10 # => 1) “0”, 2) 1) “user:3:name”, … (カーソル値0で完了)
``SSCAN
* **応用例:** 大量キーの定期的なメンテナンス、特定のキーパターンの一覧取得(本番環境向け)。
* **関連コマンド:**,HSCAN,ZSCAN` (各データ構造内の要素をスキャン)
EXISTS key [key ...]
- 説明: 指定したキーが存在するかどうかを確認します。複数のキーを指定した場合、存在するキーの数を返します。
- 構文:
EXISTS key [key ...] - 使用例:
redis
SET mykey "hello"
EXISTS mykey # => 1
EXISTS anotherkey # => 0
EXISTS mykey anotherkey # => 1
TYPE key
- 説明: 指定したキーに格納されている値のデータ型を取得します。キーが存在しない場合は
noneを返します。返される型はstring,list,set,zset,hash,stream,moduleのいずれかです。 - 構文:
TYPE key -
使用例:
“`redis
SET mykey “hello”
RPUSH mylist “A”
SADD myset “B”
HSET myhash field valueTYPE mykey # => “string”
TYPE mylist # => “list”
TYPE myset # => “set”
TYPE myhash # => “hash”
TYPE non_existent_key # => “none”
“`
EXPIRE key seconds / PEXPIRE key milliseconds
- 説明: 指定したキーに有効期限(TTL: Time To Live)を設定します。
EXPIREは秒単位、PEXPIREはミリ秒単位です。キーが存在しない場合や、有効期限の設定に失敗した場合は0を返します。成功した場合は1を返します。 - 構文:
EXPIRE key seconds,PEXPIRE key milliseconds - 使用例:
redis
SET session:abc "user:100"
EXPIRE session:abc 3600 # 1時間後に期限切れ - 関連コマンド:
TTL,PTTL,PERSIST,SET(EX/PXオプション)
TTL key / PTTL key
- 説明: 指定したキーの残り有効期限を取得します。
TTLは秒単位、PTTLはミリ秒単位です。- 有効期限が設定されている場合は、残り時間(正の整数)を返します。
- キーが存在しない場合は
-2を返します。 - 有効期限が設定されていない場合(永続的なキー)は
-1を返します。
- 構文:
TTL key,PTTL key - 使用例:
redis
SETEX tempkey 60 "value" # 60秒で期限切れ
TTL tempkey # => 55 (例: 残り時間)
PTTL tempkey # => 55000 (例: ミリ秒単位)
TTL non_existent_key # => -2
SET permanentkey "value"
TTL permanentkey # => -1
PERSIST key
- 説明: 指定したキーに設定されている有効期限を解除し、永続的なキーにします。有効期限が解除された場合は1を、元々有効期限が設定されていない場合やキーが存在しない場合は0を返します。
- 構文:
PERSIST key - 使用例:
redis
SETEX tempkey 60 "value"
TTL tempkey # => 50 (例)
PERSIST tempkey # => 1
TTL tempkey # => -1
サーバー操作コマンド (Server Commands)
Redisサーバー自体の状態確認や管理を行うためのコマンドです。
PING [message]
- 説明: サーバーが接続に応答するかを確認します。サーバーが応答する場合は
PONGを返します。オプションのmessageを指定すると、そのメッセージをそのまま返します。ネットワークの疎通確認やクライアントライブラリが正常に接続できているかのテストによく使われます。 - 構文:
PING [message] - 使用例:
redis
PING # => PONG
PING "Hello Server" # => "Hello Server"
INFO [section]
- 説明: Redisサーバーの様々な情報(サーバー、クライアント、メモリ、永続化、統計、レプリケーションなど)を取得します。
sectionを指定すると、特定の情報のみを取得できます。 - 構文:
INFO [section] - 使用例:
redis
INFO # 全ての情報を取得
INFO memory # メモリに関する情報を取得
INFO stats # 統計情報を取得 (コマンド実行回数、接続数など) - 応用例: Redisサーバーの状態監視、パフォーマンスチューニング。
CONFIG GET parameter / CONFIG SET parameter value
- 説明: Redisサーバーの設定パラメータの値を取得または設定します。
parameterには設定ファイル(redis.conf)に記述されているパラメータ名を指定します。 - 構文:
CONFIG GET parameter,CONFIG SET parameter value - 使用例:
redis
CONFIG GET maxmemory # => 1) "maxmemory", 2) "0" (例)
CONFIG SET maxmemory 1gb # OK (設定変更) - 注意点: 一部の設定は
CONFIG SETでは変更できず、設定ファイルを編集してサーバーを再起動する必要があります。変更は一時的なものになる場合もあります(再起動で元に戻る)。恒久的な変更には設定ファイルの編集が必要です。
SAVE / BGSAVE
- 説明: データベースのデータをRDB(Redis Database Backup)ファイルとしてディスクに永続化します。
SAVE: 同期的に実行されます。データ永続化が完了するまで、Redisサーバーは他のコマンドを受け付けません。キーの数が多い場合、サーバーが長時間ブロックされる可能性があります。BGSAVE: 非同期的に実行されます。子プロセスを作成してデータ永続化を行うため、サーバーはブロックされず、他のコマンドを処理し続けることができます。通常はこちらを使用します。
- 構文:
SAVE,BGSAVE - 使用例:
redis
BGSAVE # => Background saving started - 応用例: データのバックアップ、サーバー停止前のデータ保存。
- 関連コマンド:
LASTSAVE,BGREWRITEAOF(AOF永続化関連)
SHUTDOWN [SAVE|NOSAVE]
- 説明: Redisサーバーを安全に停止します。デフォルトでは、停止前にRDBファイルを保存します (
SAVEオプションを明示した場合と同じ)。NOSAVEオプションを付けると、RDBファイルを保存せずに停止します。 - 構文:
SHUTDOWN [SAVE|NOSAVE] - 使用例:
redis
SHUTDOWN # RDBを保存して停止
SHUTDOWN NOSAVE # RDBを保存せずに停止
トランザクション (Transactions)
Redisのトランザクションは、複数のコマンドをまとめて実行し、アトミックな操作を実現します。MULTI, EXEC, DISCARD, WATCHの4つのコマンドで構成されます。
MULTI
- 説明: トランザクションを開始します。これ以降に実行されたコマンドはすぐに処理されず、キューに格納されます。
- 構文:
MULTI - 使用例:
redis
MULTI
EXEC
- 説明:
MULTIコマンド以降にキューに格納された全てのコマンドを順に実行します。実行結果は、各コマンドの結果のリストとして返されます。WATCHコマンドで監視していたキーが変更されていた場合、トランザクションは中断され、nilが返されます(CAS操作)。 - 構文:
EXEC - 使用例:
redis
MULTI
INCR mycounter
GET mycounter
EXEC # => 1) (integer) 1, 2) "1"
DISCARD
- 説明: キューに格納されている全てのコマンドを破棄し、トランザクションを中止します。
MULTI状態から抜けます。 - 構文:
DISCARD - 使用例:
redis
MULTI
INCR mycounter
DISCARD # => OK
GET mycounter # => (nil) (INCRは実行されなかった)
WATCH key [key ...]
- 説明:
EXECコマンドが実行されるまで、指定したキーを監視します。MULTIの前に実行する必要があります。監視しているキーのいずれかが、WATCH実行後からEXEC実行までの間に他のクライアントによって変更された場合、そのトランザクションは中断され、EXECはnilを返します。これはCheck-And-Set (CAS) 操作を実装するために使用されます。 - 構文:
WATCH key [key ...] - 使用例:
redis
# クライアント1: 残高更新 (CASの例)
WATCH balance:user:100
balance = GET balance:user:100
# balance の値に基づいて新しい計算を行う...
MULTI
SET balance:user:100 new_calculated_balance
EXEC # この間に他のクライアントが balance:user:100 を変更していたら nil が返され、トランザクションは失敗する - 関連コマンド:
UNWATCH(監視を解除)
応用例: 銀行口座の残高更新のような、読み取りと書き込みをアトミックに行う必要がある操作。まずWATCHでキーを監視し、キーの値を読み取り、計算を行い、MULTI〜EXECで更新する。もしEXECがnilを返したら、他のクライアントがその間にキーを変更したことになるので、操作を再試行する。
Pub/Sub (Publish/Subscribe)
Redisは、Publish/Subscribeメッセージングパラダイムをサポートしています。クライアントは特定のチャンネルを購読し、別のクライアントはそのチャンネルにメッセージを公開(Publish)できます。
PUBLISH channel message
- 説明: 指定した
channelにmessageを公開します。そのチャンネルを購読している全てのクライアントにメッセージが配信されます。メッセージを受信したクライアントの数を返します。 - 構文:
PUBLISH channel message - 使用例:
redis
PUBLISH news:sports "Lakers won the championship!" # => 2 (例: 2つのクライアントが購読している場合)
SUBSCRIBE channel [channel ...]
- 説明: 指定したチャンネルを購読します。このコマンドを実行したクライアントは、これらのチャンネルで公開されたメッセージを受信するようになります。購読状態に入ると、クライアントは他のコマンドを発行できなくなります(例外:
SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,READONLY,PUBSUB,RESET)。 - 構文:
SUBSCRIBE channel [channel ...] - 使用例:
redis
SUBSCRIBE news:sports news:politics # "news:sports"と"news:politics"を購読開始
PSUBSCRIBE pattern [pattern ...]
- 説明: パターンに一致するチャンネルを購読します。パターンにはグロブスタイル(
*や?)を使用できます。SUBSCRIBEと同様、購読状態に入ると他のコマンドは発行できなくなります。 - 構文:
PSUBSCRIBE pattern [pattern ...] - 使用例:
redis
PSUBSCRIBE news:* # "news:"で始まる全てのチャンネルを購読開始
UNSUBSCRIBE [channel [channel ...]] / PUNSUBSCRIBE [pattern [pattern ...]]
- 説明: 指定したチャンネルまたはパターンの購読を解除します。チャンネルまたはパターンを指定しない場合は、全ての購読を解除します。全ての購読を解除すると、通常のコマンドを発行できるようになります。
- 構文:
UNSUBSCRIBE [channel [channel ...]],PUNSUBSCRIBE [pattern [pattern ...]] - 使用例:
redis
UNSUBSCRIBE news:sports # "news:sports"の購読を解除
PUNSUBSCRIBE news:* # "news:*"パターンの購読を解除
UNSUBSCRIBE # 全てのチャンネル購読を解除
PUNSUBSCRIBE # 全てのパターン購読を解除 - 応用例: チャットアプリケーション、リアルタイム通知システム、タスクの分散配信。
Scripting (Luaスクリプト)
RedisはLuaスクリプトの実行をサポートしており、複数のコマンドをサーバー側でアトミックに実行できます。これにより、クライアントとサーバー間のネットワークラウンドトリップを削減し、複雑なロジックをアトミックに実行することが可能になります。
EVAL script numkeys key [key ...] arg [arg ...]
- 説明: 指定したLuaスクリプトを実行します。
scriptは実行するスクリプトの文字列です。numkeysは、スクリプト内でアクセスするキーの数を指定します。key引数はスクリプト内でKEYS配列として、arg引数はARGV配列として利用できます。 - 構文:
EVAL script numkeys key [key ...] arg [arg ...] -
使用例:
“`redis
# キー’mykey’の値をインクリメントし、新しい値を返すスクリプト
EVAL “return redis.call(‘INCR’, KEYS[1])” 1 mykey # => (integer) 1
EVAL “return redis.call(‘INCR’, KEYS[1])” 1 mykey # => (integer) 2複数のキーと引数を使う例 (ここでは単純な例)
EVAL “redis.call(‘SET’, KEYS[1], ARGV[1]); return redis.call(‘GET’, KEYS[1])” 1 mykey “newvalue” # => “newvalue”
``SCRIPT DEBUG
* **注意点:** スクリプトはアトミックに実行されますが、実行時間の長いスクリプトはサーバーをブロックする可能性があります。デバッグにはコマンドが便利です。EVALSHA
* **関連コマンド:**,SCRIPT LOAD,SCRIPT EXISTS,SCRIPT FLUSH`
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
- 説明: 既にサーバーにキャッシュされているスクリプトのSHA1ハッシュを指定してスクリプトを実行します。
EVALコマンドよりもネットワーク転送量を削減できます。スクリプトはSCRIPT LOADコマンドで事前にキャッシュしておくか、初めてEVALで実行された際に自動的にキャッシュされます。 - 構文:
EVALSHA sha1 numkeys key [key ...] arg [arg ...] -
使用例:
“`redis
# まずスクリプトをキャッシュし、SHA1ハッシュを取得
SCRIPT LOAD “return redis.call(‘INCR’, KEYS[1])” # => “a6f0e…” (SHA1ハッシュ)SHA1ハッシュを使ってスクリプトを実行
EVALSHA a6f0e… 1 mykey # => (integer) 3
“`
* 応用例: パフォーマンスが重要な、頻繁に実行されるアトミックな操作。
実践的なヒントと注意点
- 大きなキーやコレクションを避ける: 1つのキーに非常に大きな値(例: 数GBの文字列)や、非常に多くの要素を持つコレクション(List, Set, Zset, Hash)を格納すると、メモリ使用量の増加、コマンド実行時の遅延、レプリケーションやフェイルオーバー時の問題を引き起こす可能性があります。データを分割するか、異なる設計を検討してください。
KEYSコマンドは本番環境で使わない: 前述の通り、KEYSはサーバーをブロックします。代わりにSCANとその関連コマンド(SSCAN,HSCAN,ZSCAN)を使用してください。- 永続化設定を理解する: RDBとAOFの永続化方法を理解し、アプリケーションの要件に合わせて適切に設定してください。データロスの許容レベルやパフォーマンスへの影響を考慮する必要があります。
- メモリ使用量を監視する: Redisはインメモリデータベースです。サーバーの物理メモリを超えてデータを格納しようとすると、スワッピングが発生してパフォーマンスが著しく低下したり、OOM (Out of Memory) エラーでクラッシュしたりする可能性があります。
INFO memoryコマンドや監視ツールでメモリ使用量を常に監視し、maxmemory設定や適切なエビクションポリシー(例:allkeys-lru)を設定してください。 - コマンドのレイテンシに注意する:
INFO commandstatsなどで各コマンドの実行時間を確認できます。遅延が発生しているコマンドがあれば、データ構造の設計を見直したり、より効率的なコマンドやパイプライン処理、Luaスクリプトの使用を検討したりしてください。 - パイプラインとトランザクション: 複数のコマンドを連続して実行する場合、ネットワークラウンドトリップのオーバーヘッドを減らすためにパイプライン処理を使用するとパフォーマンスが向上します。トランザクション(
MULTI/EXEC)はパイプラインの効果も持ちますが、それ自体がアトミックな実行を保証する機能です。アトミック性が必要かどうかで使い分けます。 - クライアントライブラリを活用する: ほとんどのプログラミング言語には高機能なRedisクライアントライブラリが存在します。これらのライブラリは、接続管理、自動再接続、パイプライン、Pub/Sub、トランザクション、スクリプトなどの機能を容易に利用できるようにしてくれます。
まとめ
この記事では、Redisの基本的な使い方から、String, List, Set, Sorted Set, Hashといった主要なデータ構造に関連する頻出コマンド、さらにはキー操作、サーバー管理、トランザクション、Pub/Sub、Scriptingに至るまで、幅広いRedisコマンドを詳細に解説しました。
Redisの強力さは、これらの多様なコマンドを組み合わせることで、キャッシュ、メッセージキュー、セッションストア、リアルタイム分析、リーダーボードなど、様々な複雑な機能をシンプルかつ高性能に実装できる点にあります。
この記事で紹介したコマンドは、Redisの全コマンドのごく一部ですが、これらを使いこなすだけでも、多くの一般的なタスクを効率的にこなせるようになります。さらに高度な機能やデータ構造(Stream、HyperLogLog、Geoなど)に興味がある場合は、Redisの公式ドキュメントを参照してください。
Redisコマンドへの理解を深め、日々の開発に役立てていただければ幸いです。高速なデータ処理を求めるアプリケーション開発において、Redisは非常に強力な味方となるでしょう。