【初心者向け】Redis CLI コマンドの使い方と基本
はじめに:Redis と Redis CLI とは?
あなたがこれからWebアプリケーションを開発したり、既存のシステムのパフォーマンスを改善しようと考えたとき、データの保存や高速な読み書きは非常に重要な課題になります。従来のデータベース(例えば、MySQLやPostgreSQLのようなリレーショナルデータベース)はデータの永続性や複雑なクエリに優れていますが、大量のデータを非常に高速に処理する用途には向かない場合があります。
ここで登場するのが Redis です。Redisは、インメモリデータ構造ストアです。これは、データをハードディスクではなく、コンピュータのメモリ上に保存することを意味します。メモリはハードディスクに比べて圧倒的に高速にデータを読み書きできるため、Redisは「高速性」が最大の特長の一つとなっています。
Redisは単なるキー・バリューストアではなく、文字列(String)、リスト(List)、セット(Set)、ソート済みセット(Sorted Set)、ハッシュ(Hash)といった、様々なデータ構造を扱うことができます。これにより、キャッシュ、メッセージキュー、セッション管理、リアルタイム分析など、幅広い用途で利用されています。
そして、今回解説する Redis CLI は、Redisサーバーと対話するためのコマンドラインインターフェイスツールです。Redis CLIを使うと、以下のことができます。
- Redisサーバーに接続する。
- Redisサーバーにコマンドを送信する。
- サーバーから返される応答を確認する。
- Redisの様々なデータ型を操作する練習をする。
- サーバーの状態や設定を確認する。
- スクリプトを実行したり、サーバーを管理したりする。
開発中や学習段階では、Redis CLIはRedisの動作を理解し、データを直接操作するための非常に強力なツールとなります。このガイドでは、Redisを全く触ったことがない初心者の方でも、Redis CLIを使って基本的なデータの操作やサーバーとの対話ができるようになることを目指します。
約5000語というボリュームで、Redis CLIの基本的な使い方から、主要なデータ型を操作するコマンド、さらには少し応用的な使い方まで、一つ一つ丁寧に解説していきます。さあ、Redisの世界へ飛び込みましょう!
Redis CLI の準備:接続してみよう
Redis CLIを使うためには、まずRedisサーバーがどこかで起動している必要があります。
- ローカル環境: 多くのOS(Linux, macOS, Windows Subsystem for Linux (WSL))では、パッケージマネージャー(
apt
,brew
など)を使ってRedisサーバーを簡単にインストールできます。インストールすれば、通常はローカルホストのポート6379
でRedisサーバーが起動します。 - リモートサーバー/クラウドサービス: Redis Cloudなどのクラウドサービスや、自分で構築したサーバー上でRedisが動いている場合もあります。
Redisサーバーが起動していることを確認したら、いよいよRedis CLIを起動して接続します。
Redis CLIの起動
ターミナル(コマンドプロンプトやPowerShellなども含む)を開き、以下のコマンドを入力します。
bash
redis-cli
デフォルトでは、redis-cli
は以下の設定で接続を試みます。
- ホスト:
127.0.0.1
(localhost) - ポート:
6379
もしRedisサーバーがこれらのデフォルト設定で起動していれば、特にオプションをつけずに redis-cli
と入力するだけで接続できるはずです。
接続に成功すると、以下のようなプロンプトが表示されます。
127.0.0.1:6379>
このプロンプトが表示されたら、Redisサーバーに対してコマンドを入力できるようになります。
異なるホストやポートに接続する場合
Redisサーバーがデフォルト以外のホストやポートで起動している場合は、オプションを指定して接続します。
-h
オプションでホスト名を指定-p
オプションでポート番号を指定
例:ホスト 192.168.1.100
のポート 6380
に接続する場合
bash
redis-cli -h 192.168.1.100 -p 6380
認証が必要な場合
もしRedisサーバーにパスワード認証が設定されている場合、接続時にパスワードを指定する必要があります。これにはいくつかの方法があります。
-
起動オプションでパスワードを指定:
bash
redis-cli -a your_password
または、ホストとポートも指定する場合:
bash
redis-cli -h your_host -p your_port -a your_password
この方法はパスワードがコマンド履歴に残る可能性があるため、注意が必要です。 -
接続後に
AUTH
コマンドを使用:
パスワードなしで接続を試み、プロンプトが表示された後にAUTH
コマンドを入力します。
bash
redis-cli
# プロンプトが表示されたら...
127.0.0.1:6379> AUTH your_password
認証に成功するとOK
が返されます。失敗するとエラーになります。
セキュリティ上、特に本番環境ではパスワード認証(またはより強力な認証・暗号化手段)を設定することが強く推奨されます。
接続の確認:PING コマンド
接続が成功したかを確認する最も簡単なコマンドは PING
です。これはサーバーに「応答してください」と送り、サーバーは「はい、応答します」と返します。
bash
127.0.0.1:6379> PING
PONG
PONG
と返ってきたら、正常に接続できており、サーバーが応答していることを意味します。もし接続できていなかったり、サーバーが停止していたりすると、エラーメッセージが表示されるか、接続自体ができないことがあります。
接続の終了:QUIT コマンド
Redis CLIセッションを終了してターミナルに戻るには、QUIT
コマンドを使用します。
bash
127.0.0.1:6379> QUIT
これでRedis CLIから抜けることができます。Ctrl+Cでも終了できる場合があります。
Redis の基本:キーとデータ型
Redisの全てのデータは、キー(Key) とそれに対応する値(Value) のペアとして保存されます。キーは必ず文字列ですが、値には様々なデータ型を使用できます。Redisが他の多くのキー・バリュー型データストアと異なるのは、この「値が多様なデータ構造を持てる」という点です。
Redis CLIを使ってコマンドを実行する際は、ほとんどの場合、操作したいデータの「キー」を指定します。
キー (Keys)
- キーはバイナリセーフな文字列です。つまり、どのような文字列でもキーとして使用できます(空文字列を除く)。
- キーの長さに制限はありませんが、長すぎるキーはメモリを消費し、短いキーよりも検索に時間がかかる可能性があります。
- 可読性が高く、構造が分かりやすいキー名をつけることが推奨されます(例:
user:123:profile
,product:abc:stock
)。:
を区切り文字として使うのはよくある慣習です。 - スペースを含むキーを使うことも可能ですが、コマンド入力時にクォートで囲む必要があるなど、取り扱いが少し面倒になります。
Redis の主要なデータ型 (Data Types)
Redisは以下の5つの主要なデータ型をサポートしています。それぞれのデータ型は、特定の種類のデータを効率的に格納・操作するために最適化されています。
-
String (文字列):
- 最も基本的なデータ型です。
- バイナリセーフです。文字列、整数、浮動小数点数、JPEG画像など、最大512MBのデータを格納できます。
- インクリメント/デクリメントのような数値操作も可能です。
- 用途:キャッシュデータ、カウンタ、セッションIDなど。
-
List (リスト):
- 文字列のリストを順序付けして格納します。
- 要素の追加はリストの両端(先頭または末尾)に効率的に行えます。
- キューやスタック、時系列データの保持などに適しています。
- 用途:最新のN件の投稿、メッセージキュー、タスクリストなど。
-
Set (セット):
- 文字列の集合です。順序はなく、同じ要素を重複して格納することはできません。
- 要素の追加、削除、存在チェックが非常に高速です。
- 集合演算(和集合、積集合、差集合)をサポートします。
- 用途:ユニークな訪問者、タグ付け、友達リストなど。
-
Sorted Set (ソート済みセット/ZSet):
- セットに似ていますが、各要素にスコア (score) と呼ばれる浮動小数点数の値が関連付けられています。
- スコアに基づいて要素が昇順にソートされます。
- 要素の追加、削除、存在チェック、範囲指定での要素取得(スコア順または辞書順)が効率的に行えます。
- 用途:リーダーボード(ゲームのランキング)、優先度付きキュー、時間によるイベント管理など。
-
Hash (ハッシュ):
- フィールドと値のペア(マップのようなもの)を格納します。
- 一つのハッシュキーの中に、複数のフィールドとその値を格納できます。
- 特定のオブジェクトのプロパティを表現するのに適しています。
- 用途:ユーザープロフィール情報、商品の詳細、オブジェクトの状態など。
これらのデータ型を理解することが、Redisを効果的に使う上で非常に重要です。Redis CLIでは、これらのデータ型に対応した様々なコマンドを使ってデータを操作します。
基本中の基本:Generic Key コマンド
まずは、どのデータ型に対しても使える、キー自体を操作する基本的なコマンドから見ていきましょう。
KEYS: パターンにマッチするキーを取得
指定したパターンにマッチする全てのキーを取得します。
bash
KEYS pattern
例:
- 全てのキーを取得:
bash
127.0.0.1:6379> KEYS *
(もしキーが存在すれば、リストで表示されます) user:
で始まるキーを取得:
bash
127.0.0.1:6379> KEYS user:*data
で始まり、任意の1文字、key
で終わるキーを取得 (?
は任意の1文字):
bash
127.0.0.1:6379> KEYS data?key
注意: KEYS
コマンドは、サーバーに大量の負荷をかける可能性があります。特にキーの数が非常に多い本番環境では、サーバー全体をブロックしてしまう危険性があるため、絶対に本番環境で KEYS *
のような広範なパターンを使わないでください。代わりに SCAN
コマンドを使うべきですが、SCAN
は初心者には少し複雑なので、ここでは KEYS
を紹介するに留めます。学習や開発用途では KEYS
は便利です。
EXISTS: キーの存在を確認
指定したキーが存在するかどうかを確認します。
bash
EXISTS key [key ...]
- 存在する場合は
1
を返します。 - 存在しない場合は
0
を返します。 - 複数のキーを指定した場合、存在するキーの数を返します。
例:
bash
127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> EXISTS mykey
(integer) 1
127.0.0.1:6379> EXISTS non_existent_key
(integer) 0
127.0.0.1:6379> EXISTS mykey non_existent_key another_key
(integer) 1
DEL: キーを削除
指定したキーとその値を削除します。複数のキーを指定できます。
bash
DEL key [key ...]
- 削除されたキーの数を返します。
例:
bash
127.0.0.1:6379> SET key1 "value1"
OK
127.0.0.1:6379> LPUSH key2 "valueA" "valueB"
(integer) 2
127.0.0.1:6379> DEL key1 key2 non_existent_key
(integer) 2
127.0.0.1:6379> EXISTS key1
(integer) 0
127.0.0.1:6379> EXISTS key2
(integer) 0
DEL
は非常に高速な操作です。
TYPE: キーのデータ型を取得
指定したキーに格納されている値のデータ型を取得します。
bash
TYPE key
- 返される値:
string
,list
,set
,zset
,hash
,stream
(Redis 5.0以降),none
(キーが存在しない場合)。
例:
bash
127.0.0.1:6379> SET my_string "abc"
OK
127.0.0.1:6379> LPUSH my_list 1 2 3
(integer) 3
127.0.0.1:6379> SADD my_set a b c
(integer) 3
127.0.0.1:6379> HSET my_hash field1 value1
(integer) 1
127.0.0.1:6379> ZADD my_zset 100 member1
(integer) 1
127.0.0.1:6379> TYPE my_string
string
127.0.0.1:6379> TYPE my_list
list
127.0.0.1:6379> TYPE my_set
set
127.0.0.1:6379> TYPE my_hash
hash
127.0.0.1:6379> TYPE my_zset
zset
127.0.0.1:6379> TYPE non_existent_key
none
キーに何が入っているか分からなくなったときに便利なコマンドです。
RENAME: キーの名前を変更
キーの名前を変更します。
bash
RENAME oldkey newkey
- 操作が成功すると
OK
を返します。 oldkey
が存在しない場合はエラーになります。newkey
が既に存在する場合、そのキーは上書きされ削除されます。
例:
bash
127.0.0.1:6379> SET original_key "some value"
OK
127.0.0.1:6379> RENAME original_key renamed_key
OK
127.0.0.1:6379> EXISTS original_key
(integer) 0
127.0.0.1:6379> EXISTS renamed_key
(integer) 1
127.0.0.1:6379> GET renamed_key
"some value"
TTL: キーの有効期限(Time To Live)を取得
キーの有効期限(あと何秒でキーが削除されるか)を取得します。
bash
TTL key
- 正の整数: 残り秒数。
-2
: キーが存在しない。-1
: キーは存在するが、有効期限が設定されていない。
例:
bash
127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> TTL mykey
(integer) -1 # 有効期限なし
127.0.0.1:6379> EXPIRE mykey 60 # 60秒後に期限切れにする
(integer) 1 # 有効期限設定成功
127.0.0.1:6379> TTL mykey
(integer) 58 # 例: 残り58秒
PTTL
コマンドはミリ秒単位で有効期限を取得できます。
EXPIRE: キーに有効期限を設定
指定したキーに有効期限を設定します。指定秒数経過後にキーは自動的に削除されます。
bash
EXPIRE key seconds
- 有効期限の設定に成功すると
1
を返します。 - キーが存在しない場合は
0
を返します。
例:
“`bash
127.0.0.1:6379> SET temp_data “this will disappear”
OK
127.0.0.1:6379> EXPIRE temp_data 10 # 10秒後に削除
(integer) 1
127.0.0.1:6379> TTL temp_data
(integer) 9 # 例: 残り9秒
10秒以上待つ…
127.0.0.1:6379> EXISTS temp_data
(integer) 0
``
PEXPIREはミリ秒単位、
EXPIREATはUnixタイムスタンプ(秒単位)、
PEXPIREAT` はUnixタイムスタンプ(ミリ秒単位)で有効期限を設定できます。TTL(有効期限)は、キャッシュの実装で非常によく使われます。
Redis のデータ型別コマンド詳解
ここからは、Redisの主要なデータ型ごとに、CLIでよく使うコマンドを詳しく見ていきます。
1. String (文字列) コマンド
String型は最も単純ですが、非常に多機能です。
SET: キーに文字列値を設定
指定したキーに値を設定します。キーが既に存在する場合、古い値は上書きされます。
bash
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds] [KEEPTTL]
オプションは色々ありますが、まずは基本形を覚えましょう。
基本例:
bash
127.0.0.1:6379> SET mykey "Hello Redis"
OK
127.0.0.1:6379> GET mykey
"Hello Redis"
便利なオプション:
NX
: キーが存在しない場合にのみ設定します(”Not eXists”)。新しいキーの作成にのみ使用できます。XX
: キーが既に存在する場合にのみ設定します(”eXists”)。既存のキーの更新にのみ使用できます。EX seconds
: 指定した秒数後にキーが期限切れになるように設定します(EXPIRE
と同じ効果)。PX milliseconds
: 指定したミリ秒数後にキーが期限切れになるように設定します。
オプション例:
bash
127.0.0.1:6379> SET user:1:name "Alice" NX # user:1:name が存在しない場合のみ設定
OK
127.0.0.1:6379> SET user:1:name "Bob" NX # user:1:name は既に存在するので失敗
(nil)
127.0.0.1:6379> SET user:1:name "Charlie" XX # user:1:name が存在する場合のみ更新
OK
127.0.0.1:6379> GET user:1:name
"Charlie"
127.0.0.1:6379> SET cache:item:123 "cached data" EX 300 # 5分後に期限切れ
OK
SET
コマンドは非常に汎用性が高く、オプションを使うことでアトミックな(中断されない)条件付き操作や有効期限設定を同時に行えます。
GET: キーの値を取得
指定したキーに関連付けられた値を取得します。キーが存在しない場合は nil
が返されます。
bash
GET key
例:
bash
127.0.0.1:6379> SET mykey "some value"
OK
127.0.0.1:6379> GET mykey
"some value"
127.0.0.1:6379> GET non_existent_key
(nil) # キーが存在しない
GET
はString型専用のコマンドです。他の型のキーに対して GET
を実行するとエラーになります(ただし、Redis 4.0 以降のバージョンによってはエラーではなく WRONGTYPE
エラーとなります)。
MSET: 複数のキーに値をまとめて設定
複数のキーと値を一度に設定します。これはネットワークのラウンドトリップ数を減らすため、パフォーマンスの向上に役立ちます。
bash
MSET key value [key value ...]
例:
bash
127.0.0.1:6379> MSET key1 "value1" key2 "value2" key3 "value3"
OK
127.0.0.1:6379> GET key1
"value1"
127.0.0.1:6379> GET key2
"value2"
127.0.0.1:6379> GET key3
"value3"
MGET: 複数のキーの値をまとめて取得
複数のキーの値を一度に取得します。
bash
MGET key [key ...]
- 指定したキーの値をリストで返します。
- キーが存在しない場合、その位置には
nil
が格納されます。
例:
bash
127.0.0.1:6379> MSET keyA "valA" keyC "valC"
OK
127.0.0.1:6379> MGET keyA keyB keyC keyD
1) "valA"
2) (nil)
3) "valC"
4) (nil)
INCR: キーの値をインクリメント
キーに格納されている数値を1増やします。キーが存在しない場合、値は 0
とみなされて 1
になります。キーの値が数値として解釈できない場合はエラーになります。
bash
INCR key
- インクリメント後の値を返します。
例:
bash
127.0.0.1:6379> SET counter 10
OK
127.0.0.1:6379> INCR counter
(integer) 11
127.0.0.1:6379> INCR counter
(integer) 12
127.0.0.1:6379> INCR new_counter # 存在しないキー
(integer) 1
INCRBY
コマンドで指定した量だけ増やしたり、INCRBYFLOAT
で浮動小数点数で増やしたりすることも可能です。
DECR: キーの値をデクリメント
キーに格納されている数値を1減らします。INCR
の逆の操作です。
bash
DECR key
- デクリメント後の値を返します。
例:
bash
127.0.0.1:6379> SET counter 10
OK
127.0.0.1:6379> DECR counter
(integer) 9
127.0.0.1:6379> DECR new_counter # 存在しないキー
(integer) -1
DECRBY
コマンドで指定した量だけ減らすことも可能です。これらのコマンドは、カウンタやレートリミットなどの実装によく使われます。
APPEND: キーの値の末尾に文字列を追加
指定したキーの値の末尾に文字列を追加します。キーが存在しない場合、新しくキーが作成され、指定した文字列が値として設定されます(この場合は SET
と同じ動作になります)。
bash
APPEND key value
- APPEND後の文字列の長さを返します。
例:
bash
127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> APPEND mykey " World"
(integer) 11 # "Hello World" になったので長さは11
127.0.0.1:6379> GET mykey
"Hello World"
127.0.0.1:6379> APPEND new_key "Initial" # new_key は存在しない
(integer) 7
127.0.0.1:6379> GET new_key
"Initial"
STRLEN: キーに格納されている文字列値の長さを取得
指定したキーに格納されている文字列値の長さをバイト数で返します。キーが存在しない場合は 0
を返します。
bash
STRLEN key
例:
bash
127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> STRLEN mykey
(integer) 5
127.0.0.1:6379> STRLEN non_existent_key
(integer) 0
2. List (リスト) コマンド
List型は、順序付けされた文字列要素のコレクションです。両端からの追加/削除が効率的です。
LPUSH: リストの左側(先頭)に要素を追加
リストの左側(先頭)に1つ以上の要素を追加します。キーが存在しない場合、新しくリストが作成されます。
bash
LPUSH key element [element ...]
- 操作後のリストの長さを返します。
例:
bash
127.0.0.1:6379> LPUSH mylist "world"
(integer) 1
127.0.0.1:6379> LPUSH mylist "hello"
(integer) 2 # リストは ["hello", "world"] になった
127.0.0.1:6379> LPUSH mylist "pre" "append" # 複数の要素を追加
(integer) 4 # リストは ["append", "pre", "hello", "world"] になった
RPUSH: リストの右側(末尾)に要素を追加
リストの右側(末尾)に1つ以上の要素を追加します。
bash
RPUSH key element [element ...]
- 操作後のリストの長さを返します。
例:
bash
127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "world"
(integer) 2 # リストは ["hello", "world"] になった
127.0.0.1:6379> RPUSH mylist "post" "pend" # 複数の要素を追加
(integer) 4 # リストは ["hello", "world", "post", "pend"] になった
LPUSH
と RPUSH
を組み合わせることで、キュー(LPUSH
で追加、RPOP
で取り出し)やスタック(LPUSH
で追加、LPOP
で取り出し)として利用できます。
LPOP: リストの左側(先頭)から要素を取り出し
リストの左側(先頭)から要素を一つ取り出して返します。取り出した要素はリストから削除されます。リストが空の場合やキーが存在しない場合は nil
を返します。
bash
LPOP key
例:
bash
127.0.0.1:6379> RPUSH mylist "a" "b" "c"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1 # 現在のリストを確認
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> LPOP mylist
"a"
127.0.0.1:6379> LPOP mylist
"b"
127.0.0.1:6379> LPOP mylist
"c"
127.0.0.1:6379> LPOP mylist
(nil) # リストが空になった
Redis 5.0以降では、LPOP key count
のように複数要素をまとめて取り出すことも可能です。
RPOP: リストの右側(末尾)から要素を取り出し
リストの右側(末尾)から要素を一つ取り出して返します。取り出した要素はリストから削除されます。リストが空の場合やキーが存在しない場合は nil
を返します。
bash
RPOP key
例:
bash
127.0.0.1:6379> RPUSH mylist "a" "b" "c"
(integer) 3
127.0.0.1:6379> LPOP mylist # 先頭から取り出し
"a"
127.0.0.1:6379> RPOP mylist # 末尾から取り出し
"c"
1227.0.0.1:6379> LRANGE mylist 0 -1 # 残りは "b" だけ
1) "b"
RPOP
も Redis 5.0以降では複数要素取り出し (RPOP key count
) をサポートします。
LRANGE: リストの範囲指定で要素を取得
リストの指定した範囲の要素を取得します。
bash
LRANGE key start stop
* start
と stop
は0ベースのインデックスです。
* 0
はリストの最初の要素、1
は2番目の要素… を示します。
* 負のインデックスも使用できます。-1
は最後の要素、-2
は最後から2番目の要素… を示します。
* start
が stop
より大きい場合、空のリストが返されます。
* 範囲がリストの実際の長さを超えてもエラーにはならず、リストの末尾または先頭で打ち切られます。
* 0 -1
と指定すると、リストの全ての要素を取得できます。
例:
bash
127.0.0.1:6379> RPUSH mylist "apple" "banana" "cherry" "date" "elderberry"
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 2 # 最初の3要素 (インデックス 0, 1, 2)
1) "apple"
2) "banana"
3) "cherry"
127.0.0.1:6379> LRANGE mylist -3 -1 # 後ろから3要素 (インデックス -3, -2, -1)
1) "cherry"
2) "date"
3) "elderberry"
127.0.0.1:6379> LRANGE mylist 1 -2 # 2番目から最後から2番目まで
1) "banana"
2) "cherry"
3) "date"
127.0.0.1:6379> LRANGE mylist 0 -1 # 全ての要素
1) "apple"
2) "banana"
3) "cherry"
4) "date"
5) "elderberry"
LRANGE
はリストの内容を確認したり、特定の範囲の要素を取得したりするのに非常に便利なコマンドです。ただし、非常に長いリストに対して LRANGE 0 -1
を実行すると、大量のデータを一度に転送することになるため、注意が必要です。
LLEN: リストの長さを取得
リストに格納されている要素の数を返します。キーが存在しない場合は 0
を返します。
bash
LLEN key
例:
bash
127.0.0.1:6379> RPUSH mylist a b c
(integer) 3
127.0.0.1:6379> LLEN mylist
(integer) 3
127.0.0.1:6379> DEL mylist
(integer) 1
127.0.0.1:6379> LLEN mylist
(integer) 0
LINDEX: リストの指定したインデックスの要素を取得
リストの指定したインデックスにある要素を取得します。インデックスは0ベースで、負のインデックスも使用できます。インデックスが範囲外の場合や、キーが存在しない場合は nil
を返します。
bash
LINDEX key index
例:
bash
127.0.0.1:6379> RPUSH mylist a b c d e
(integer) 5
127.0.0.1:6379> LINDEX mylist 0 # 最初の要素
"a"
127.0.0.1:679> LINDEX mylist 2 # 3番目の要素
"c"
127.0.0.1:6379> LINDEX mylist -1 # 最後の要素
"e"
127.0.0.1:6379> LINDEX mylist 10 # 範囲外のインデックス
(nil)
LINDEX
はリストの特定位置の要素をピンポイントで取得したい場合に便利です。
LREM: リストから指定した要素を削除
リストから指定した値と等しい要素を、指定した個数だけ削除します。
bash
LREM key count value
count
の意味:count > 0
: リストの先頭から末尾に向かって、最初にマッチしたvalue
をcount
個削除します。count < 0
: リストの末尾から先頭に向かって、最初にマッチしたvalue
を|count|
個削除します。count = 0
: リスト内のvalue
と等しい全ての要素を削除します。
- 削除された要素の数を返します。
例:
bash
127.0.0.1:6379> RPUSH mylist "a" "b" "a" "c" "a" "b"
(integer) 6
127.0.0.1:6379> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "a"
4) "c"
5) "a"
6) "b"
127.0.0.1:6379> LREM mylist 1 "a" # 先頭から最初の "a" を1つ削除
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 -1
1) "b"
2) "a"
3) "c"
4) "a"
5) "b"
127.0.0.1:6379> LREM mylist -2 "b" # 末尾から最初の "b" を2つ削除
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "a"
2) "c"
3) "a"
127.0.0.1:6379> LREM mylist 0 "a" # 全ての "a" を削除
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "c"
LREM
は、リストの中から特定の要素をクリーンアップしたい場合などに使用します。
3. Set (セット) コマンド
Set型は、ユニークな要素の順序付けされていないコレクションです。重複する要素は格納されません。
SADD: セットにメンバーを追加
セットに1つ以上のメンバーを追加します。指定したメンバーが既にセットに存在する場合、それは無視されます。キーが存在しない場合、新しくセットが作成されます。
bash
SADD key member [member ...]
- 新しくセットに追加されたメンバーの数を返します。
例:
bash
127.0.0.1:6379> SADD my_set "apple"
(integer) 1
127.0.0.1:6379> SADD my_set "banana" "cherry" "apple" # apple は既に存在
(integer) 2 # banana と cherry が新しく追加された
127.0.0.1:6379> SMEMBERS my_set # セットの全メンバーを取得 (順序は不定)
1) "banana"
2) "cherry"
3) "apple"
SADD
は、ユニークな要素のリストを作りたい場合などに便利です。
SMEMBERS: セットの全てのメンバーを取得
セットに格納されている全てのメンバーを取得します。セットが空の場合やキーが存在しない場合は空のリストを返します。要素の順序は保証されません。
bash
SMEMBERS key
例:
bash
127.0.0.1:6379> SADD fruits "apple" "banana" "orange"
(integer) 3
127.0.0.1:6379> SMEMBERS fruits
1) "banana"
2) "apple"
3) "orange" # 実行するたびに順序が変わる可能性がある
127.0.0.1:6379> SMEMBERS non_existent_set
(empty list or set)
SMEMBERS
も LRANGE 0 -1
と同様に、巨大なセットに対して実行すると大量のデータを転送することになるため、注意が必要です。代わりに SSCAN
を使う方がスケーラブルです。
SISMEMBER: 指定したメンバーがセットに存在するか確認
指定したメンバーがセットに存在するかを確認します。
bash
SISMEMBER key member
- 存在する場合は
1
を返します。 - 存在しない場合や、キーが存在しない場合は
0
を返します。
例:
bash
127.0.0.1:6379> SADD my_set "member1" "member2"
(integer) 2
127.0.0.1:6379> SISMEMBER my_set "member1"
(integer) 1
127.0.0.1:6379> SISMEMBER my_set "member3"
(integer) 0
127.0.0.1:6379> SISMEMBER non_existent_set "member1"
(integer) 0
これは、要素の存在チェックを非常に高速に行えるため、Set型がよく使われる理由の一つです。
SCARD: セットのメンバー数を取得
セットに格納されているメンバーの数を返します。キーが存在しない場合は 0
を返します。
bash
SCARD key
例:
bash
127.0.0.1:6379> SADD my_set "a" "b" "c" "a"
(integer) 3 # "a" は重複なので3つ
127.0.0.1:6379> SCARD my_set
(integer) 3
127.0.0.1:6379> SCARD non_existent_set
(integer) 0
SREM: セットからメンバーを削除
セットから1つ以上のメンバーを削除します。指定したメンバーがセットに存在しない場合、それは無視されます。
bash
SREM key member [member ...]
- 実際にセットから削除されたメンバーの数を返します。
例:
bash
127.0.0.1:6379> SADD my_set "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> SREM my_set "a" "c" "e" # "a", "c" を削除, "e" は無視
(integer) 2
1227.0.0.1:6379> SMEMBERS my_set
1) "b"
2) "d"
集合演算 (SUNION, SINTER, SDIFF)
Set型は集合演算をサポートしており、複数のセットを組み合わせて新しいセットを計算できます。
SUNION set [set ...]
: 指定した全てのセットの和集合(全てのセットに含まれるユニークなメンバー全て)を取得します。SINTER set [set ...]
: 指定した全てのセットの積集合(全てのセットに共通して含まれるメンバー)を取得します。SDIFF set [set ...]
: 最初のセットには含まれるが、それ以降の他のどのセットにも含まれないメンバー(差集合)を取得します。
これらのコマンドには、結果を新しいキーに保存する SUNIONSTORE
, SINTERSTORE
, SDIFFSTORE
コマンドもあります。
例 (SINTER – 積集合):
bash
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> SADD set3 "c" "f" "g"
(integer) 3
127.0.0.1:6379> SINTER set1 set2 set3 # 3つのセット全てに共通するメンバー
1) "c"
4. Sorted Set (ソート済みセット/ZSet) コマンド
Sorted Set型は、セットに似ていますが、各メンバーにスコアが関連付けられており、そのスコアによってメンバーが自動的にソートされます。重複するスコアを持つメンバーは、辞書順でソートされます。メンバー自体はユニークです。
ZADD: ソート済みセットにメンバーを追加(または更新)
ソート済みセットに1つ以上のメンバーとそれに対応するスコアを追加します。指定したメンバーが既に存在する場合、そのスコアは新しいスコアで更新されます。キーが存在しない場合、新しくソート済みセットが作成されます。
bash
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
ここでもオプションは多数ありますが、基本形から始めましょう。
基本例:
bash
127.0.0.1:6379> ZADD myzset 100 "member1"
(integer) 1
127.0.0.1:6379> ZADD myzset 200 "member2" 50 "member3" # 複数のメンバーを追加
(integer) 2
127.0.0.1:6379> ZADD myzset 150 "member1" # 既存メンバー member1 のスコアを更新
(integer) 0 # 新しく追加されたメンバーは0人
127.0.0.1:6379> ZSCORE myzset "member1" # member1 の新しいスコアを確認
"150"
ZRANGE: スコア順で範囲指定のメンバーを取得
ソート済みセットの指定した範囲(インデックス)のメンバーを、スコアの昇順で取得します。
bash
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
最も基本的な使い方はインデックス指定と WITHSCORES
オプションです。
start
,stop
: 0ベースのインデックス (LRANGE
と同様に負のインデックスも使用可能)。WITHSCORES
: メンバーだけでなく、そのスコアも一緒に取得します。
例 (インデックス指定):
bash
127.0.0.1:6379> ZADD leaderboard 100 player:1 50 player:2 120 player:3 80 player:4
(integer) 4
127.0.0.1:6379> ZRANGE leaderboard 0 -1 # 全てのメンバーをスコア昇順で取得
1) "player:2"
2) "player:4"
3) "player:1"
4) "player:3"
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES # スコアも一緒に取得
1) "player:2"
2) "50"
3) "player:4"
4) "80"
5) "player:1"
6) "100"
7) "player:3"
8) "120"
127.0.0.1:6379> ZRANGE leaderboard 1 2 # 2番目と3番目のメンバー (インデックス 1, 2)
1) "player:4"
2) "player:1"
ZRANGE
は、Sorted Set の最も中心的なコマンドの一つです。
ZREVRANGE: スコア逆順で範囲指定のメンバーを取得
ZRANGE
と似ていますが、スコアの降順でメンバーを取得します。リーダーボードなどで上位ランキングを取得する場合によく使われます。
bash
ZREVRANGE key start stop [WITHSCORES]
例:
bash
127.0.0.1:6379> ZREVRANGE leaderboard 0 -1 WITHSCORES # スコア降順で全てのメンバーとスコアを取得
1) "player:3"
2) "120"
3) "player:1"
4) "100"
5) "player:4"
6) "80"
7) "player:2"
8) "50"
127.0.0.1:6379> ZREVRANGE leaderboard 0 2 # 上位3名のメンバーを取得 (インデックス 0, 1, 2 - スコア降順)
1) "player:3"
2) "player:1"
3) "player:4"
ZRANGE
と ZREVRANGE
には BYSCORE
や BYLEX
オプションを使ったより複雑な範囲指定(スコアの最小値・最大値を指定するなど)も可能ですが、最初はインデックスでの範囲指定から覚えるのが良いでしょう。
ZRANGEBYSCORE: スコアの範囲指定でメンバーを取得
指定したスコアの最小値と最大値の範囲に含まれるメンバーを、スコアの昇順で取得します。
bash
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
min
,max
: スコアの最小値と最大値。-inf
は負の無限大、+inf
は正の無限大を表します。(min
や(max
のように括弧をつけると、その値を含まない(排他的)範囲指定になります。
例:
bash
127.0.0.1:6379> ZRANGE leaderboard -inf +inf WITHSCORES # 全て(ZRANGE 0 -1 WITHSCORES と同じ)
1) "player:2"
2) "50"
...
127.0.0.1:6379> ZRANGEBYSCORE leaderboard 80 120 WITHSCORES # スコア 80 から 120 の範囲のメンバー
1) "player:4"
2) "80"
3) "player:1"
4) "100"
5) "player:3"
6) "120"
127.0.0.1:6379> ZRANGEBYSCORE leaderboard (80 120 WITHSCORES # スコア 80 は含まない (80 < score <= 120)
1) "player:1"
2) "100"
3) "player:3"
4) "120"
ZREVRANGEBYSCORE
はスコアの降順で同じ範囲指定を行います。
ZCARD: ソート済みセットのメンバー数を取得
ソート済みセットに格納されているメンバーの数を返します。キーが存在しない場合は 0
を返します。
bash
ZCARD key
例:
bash
127.0.0.1:6379> ZADD myzset 1 a 2 b 3 c
(integer) 3
127.0.0.1:6379> ZCARD myzset
(integer) 3
ZSCORE: メンバーのスコアを取得
ソート済みセット内の指定したメンバーのスコアを取得します。メンバーが存在しない場合やキーが存在しない場合は nil
を返します。
bash
ZSCORE key member
例:
bash
127.0.0.1:6379> ZADD myzset 100 member1 200 member2
(integer) 2
127.0.0.1:6379> ZSCORE myzset "member1"
"100"
127.0.0.1:6379> ZSCORE myzset "member3"
(nil)
ZREM: ソート済みセットからメンバーを削除
ソート済みセットから1つ以上のメンバーを削除します。指定したメンバーがセットに存在しない場合、それは無視されます。
bash
ZREM key member [member ...]
- 実際にセットから削除されたメンバーの数を返します。
例:
bash
127.0.0.1:6379> ZADD myzset 1 a 2 b 3 c 4 d
(integer) 4
127.0.0.1:6379> ZREM myzset "b" "d" "e" # b, d を削除, e は無視
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "a"
2) "1"
3) "c"
4) "3"
5. Hash (ハッシュ) コマンド
Hash型は、文字列フィールドとその値のペア(マップや辞書のようなもの)を格納します。一つのキーの下に複数のフィールド-値ペアを持つことができます。
HSET: ハッシュにフィールドと値を設定
ハッシュキー内の指定したフィールドに値を設定します。フィールドが既に存在する場合、その値は上書きされます。キーが存在しない場合、新しくハッシュが作成されます。
bash
HSET key field value [field value ...]
Redis 4.0以降では、複数のフィールド-値ペアを一度に設定できるようになりました。
- 追加または更新されたフィールドの数を返します。
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice"
(integer) 1 # 新しくフィールドが追加された
127.0.0.1:6379> HSET user:1 age "30" city "Tokyo" # 複数のフィールドを追加
(integer) 2
127.0.0.1:6379> HGET user:1 name # 後述する HGET で値を取得
"Alice"
127.0.0.1:6379> HGET user:1 age
"30"
127.0.0.1:6379> HSET user:1 age "31" # 既存フィールドの値を更新
(integer) 0 # 新規追加されたフィールドは0
127.0.0.1:6379> HGET user:1 age
"31"
古いバージョンでは HMSET
を使っていましたが、Redis 4.0以降は HSET
で複数フィールド設定が推奨されています。
HGET: ハッシュの指定したフィールドの値を取得
ハッシュキー内の指定したフィールドの値を取得します。キーが存在しない場合、フィールドが存在しない場合、または値が nil
の場合は nil
を返します。
bash
HGET key field
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30"
(integer) 2
127.0.0.1:6379> HGET user:1 name
"Alice"
127.0.0.1:6379> HGET user:1 city
(nil) # フィールドが存在しない
127.0.0.1:6379> HGET non_existent_key some_field
(nil) # キーが存在しない
HMGET: ハッシュの複数のフィールドの値をまとめて取得
ハッシュキー内の複数のフィールドの値を一度に取得します。
bash
HMGET key field [field ...]
- 指定したフィールドの値をリストで返します。
- フィールドが存在しない場合、その位置には
nil
が格納されます。
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30" city "Tokyo"
(integer) 3
127.0.0.1:6379> HMGET user:1 name email age non_existent_field
1) "Alice"
2) (nil) # email フィールドは存在しない
3) "30"
4) (nil) # non_existent_field は存在しない
HGETALL: ハッシュの全てのフィールドと値を取得
ハッシュキー内の全てのフィールドと値をリストで取得します。リストはフィールドと値が交互に並んだ形式 (field1 value1 field2 value2 ...
) で返されます。ハッシュが空の場合やキーが存在しない場合は空のリストを返します。
bash
HGETALL key
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30" city "Tokyo"
(integer) 3
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "city"
6) "Tokyo"
HGETALL
も、非常に多くのフィールドを持つハッシュに対して実行すると大量のデータを転送することになるため、注意が必要です。代わりに HSCAN
を使う方がスケーラブルです。
HKEYS: ハッシュの全てのフィールド名を取得
ハッシュキー内の全てのフィールド名をリストで取得します。
bash
HKEYS key
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30" city "Tokyo"
(integer) 3
127.0.0.1:6379> HKEYS user:1
1) "name"
2) "age"
3) "city"
HVALS: ハッシュの全ての値を取得
ハッシュキー内の全ての値をリストで取得します。
bash
HVALS key
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30" city "Tokyo"
(integer) 3
127.0.0.1:6379> HVALS user:1
1) "Alice"
2) "30"
3) "Tokyo"
HLEN: ハッシュに含まれるフィールド数を取得
ハッシュキーに含まれるフィールドの数を返します。キーが存在しない場合は 0
を返します。
bash
HLEN key
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30"
(integer) 2
127.0.0.1:6379> HLEN user:1
(integer) 2
127.0.0.1:6379> HLEN non_existent_key
(integer) 0
HDEL: ハッシュからフィールドを削除
ハッシュキーから1つ以上のフィールドを削除します。指定したフィールドが存在しない場合、それは無視されます。
bash
HDEL key field [field ...]
- 実際にハッシュから削除されたフィールドの数を返します。ハッシュキーから全てのフィールドが削除されると、そのキー自体も自動的に削除されます。
例:
bash
127.0.0.1:6379> HSET user:1 name "Alice" age "30" city "Tokyo"
(integer) 3
127.0.0.1:6379> HDEL user:1 age city email # age, city を削除, email は無視
(integer) 2
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
その他の便利な Redis CLI コマンド
基本的なデータ型操作コマンドの他に、Redis CLIにはサーバーの状態確認や特殊な操作を行うためのコマンドも多数あります。初心者向けにいくつか紹介します。
SELECT: データベースの選択
Redisはデフォルトで16個の論理データベース(DB 0 から DB 15)を持っています。SELECT
コマンドで操作するデータベースを切り替えることができます。デフォルトではDB 0に接続されます。
bash
SELECT index
index
: 選択したいデータベースの番号(0-15)。
例:
bash
127.0.0.1:6379> SET mykey_db0 "hello in db0"
OK
127.0.0.1:6379> SELECT 1 # データベース1に切り替え
OK
127.0.0.1:6380[1]> # プロンプトも変わる
127.0.0.1:6380[1]> GET mykey_db0
(nil) # DB 1には存在しない
127.0.0.1:6380[1]> SET mykey_db1 "hello in db1"
OK
127.0.0.1:6380[1]> SELECT 0 # データベース0に戻る
OK
127.0.0.1:6379> GET mykey_db0
"hello in db0" # DB 0 には存在する
127.0.0.1:6379> GET mykey_db1
(nil) # DB 0 には存在しない
異なる用途のデータを別のデータベースに分けることができますが、ほとんどのモダンなアプリケーションでは単一のデータベース(DB 0)を使い、キー名の命名規則でデータを区分するのが一般的です(例: cache:
, user:
, product:
など)。
INFO: サーバー情報の取得
Redisサーバーの様々な情報(サーバー情報、クライアント接続数、メモリ使用量、永続化情報、統計情報、レプリケーション情報など)を取得します。
bash
INFO [section]
section
を指定しない場合は、全ての情報が表示されます。- 特定のセクションを指定することもできます(例:
INFO memory
,INFO stats
,INFO replication
)。
例:
“`bash
127.0.0.1:6379> INFO # 全ての情報を表示
Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_build_id:834452206c440e8f
redis_mode:standalone
os:Darwin 21.6.0 x86_64
…
Memory
used_memory:1087512
used_memory_human:1.04M
used_memory_peak:1210320
…
Stats
total_connections_received:100
total_commands_processed:200
…
127.0.0.1:6379> INFO memory # メモリ情報のみ表示
Memory
used_memory:1087512
used_memory_human:1.04M
…
``
INFO` コマンドはサーバーの状態監視やデバッグに非常に役立ちます。
SHUTDOWN: サーバーの停止
Redisサーバーを安全に停止します。永続化設定が有効な場合、データはディスクに保存されてからシャットダウンされます。
bash
SHUTDOWN [NOSAVE | SAVE]
NOSAVE
: データ永続化を行わずにシャットダウンします。SAVE
: データ永続化を行ってからシャットダウンします(永続化設定に関わらず強制的に実行)。
例:
bash
127.0.0.1:6379> SHUTDOWN
CLIセッションは切断されます。Redisサーバープロセスが停止することを確認してください。
ECHO: 文字列の出力
指定した文字列をそのまま返します。簡単なテストやスクリプトでのメッセージ表示に使えます。
bash
ECHO message
例:
bash
127.0.0.1:6379> ECHO "Hello Redis User!"
"Hello Redis User!"
CLIでのパイプライニング
Redis CLIは、複数のコマンドをまとめてサーバーに送信するパイプライニングをサポートしています。これにより、コマンドごとにネットワークのラウンドトリップが発生するのを避けることができ、特に大量のコマンドを実行する際にパフォーマンスが大幅に向上します。
CLIでパイプライニングを使うには、複数のコマンドを標準入力からCLIに渡します。
例:
“`bash
SET 1 a, SET 2 b, GET 1, GET 2 の4つのコマンドをパイプライニングで実行
echo -e “SET 1 a\nSET 2 b\nGET 1\nGET 2” | redis-cli
“`
出力は以下のようになります。各コマンドの応答が順に表示されます。
OK
OK
"a"
"b"
これは非常に効率的な方法です。ファイルに大量のコマンドを記述しておき、それを redis-cli < commands.txt
のように読み込ませてパイプライニング実行することも可能です。
CLIでのトランザクション
Redis CLIを使ってトランザクションを試すこともできます。トランザクションは MULTI
, EXEC
, DISCARD
コマンドで構成されます。MULTI
で開始されたトランザクション内のコマンドはキューに入れられ、EXEC
でまとめて実行されるか、DISCARD
で破棄されます。トランザクションはアトミック性が保証されます(ただし、スクリプト実行時のアトミック性とは少し異なります)。
例:
bash
127.0.0.1:6379> MULTI # トランザクション開始
OK
127.0.0.1:6379> INCR mycounter # コマンドはキューに入れられる
QUEUED
127.0.0.1:6379> SET mykey "new value" # コマンドはキューに入れられる
QUEUED
127.0.0.1:6379> GET mycounter # コマンドはキューに入れられる
QUEUED
127.0.0.1:6379> EXEC # キューに入れたコマンドを実行
1) (integer) 1 # INCR mycounter の結果
2) OK # SET mykey "new value" の結果
3) "1" # GET mycounter の結果 (INCR 後の値)
DISCARD
を使うと、キューに入れたコマンドは実行されずに破棄されます。
bash
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR another_counter
QUEUED
127.0.0.1:6379> SET another_key "temp"
QUEUED
127.0.0.1:6379> DISCARD # トランザクションを破棄
OK
127.0.0.1:6379> GET another_counter # コマンドは実行されていないので nil
(nil)
Redis CLI 使用上のヒントとベストプラクティス
Redis CLIをより効果的に使うためのヒントや、避けるべきことなどを紹介します。
- ヘルプ機能:
redis-cli
で接続中にhelp
と入力すると、コマンドのリストが表示されます。help <command_name>
と入力すると、そのコマンドの詳細な情報が表示されます(例:help SET
)。
bash
127.0.0.1:6379> help GET
GET key
summary: Get the value of a key
since: 1.0.0
... (詳細な説明やオプションなど) - コマンド履歴: ほとんどの環境で、矢印キー(↑↓)を使って過去に入力したコマンドを呼び出すことができます。これは同じコマンドを繰り返し実行したり、タイプミスを修正したりするのに便利です。
- オートコンプリート: コマンドやキー名の入力中にTabキーを押すと、補完候補が表示されることがあります。これは長いキー名や複雑なコマンドを入力する際に非常に便利です。
- キー名の命名規則: データの種類や関連性を示す分かりやすいキー名を使用しましょう(例:
users:1:profile
,products:shoes:stock
,orders:pending
)。:
や-
を区切り文字として使うのが一般的です。 KEYS
コマンドの危険性: 前述しましたが、本番環境でKEYS *
のようなコマンドを使うとサーバー全体が停止する可能性があります。キーの探索が必要な場合は、より安全なSCAN
コマンドを使いましょう。初心者にとってはKEYS
は学習用と割り切って使用してください。- 大文字/小文字: Redisコマンド名は大文字でも小文字でも実行できます(例:
GET
とget
は同じ)。ただし、可読性を高めるために大文字で記述することが多いです。キー名や値はケースセンシティブです(mykey
とMyKey
は異なるキーとして扱われます)。 - オペレーションの複雑性: 各コマンドにはO(1)(定数時間)やO(N)(要素数Nに比例する時間)、O(log N)(要素数の対数に比例する時間)といった計算量(時間計算量)があります。Redisのドキュメントには各コマンドの計算量が記載されています。CLIで簡単な操作を行う分にはあまり気にする必要はありませんが、大量のデータに対してO(N)のコマンド(例:
LRANGE 0 -1
,SMEMBERS
,HGETALL
)を実行する場合は注意が必要です。 - パイプライニングの活用: 複数のコマンドをまとめて実行したい場合は、CLIのパイプライニング機能を使うことで効率が上がります。
- パスワードの取り扱い:
-a
オプションでパスワードを渡す場合、コマンド履歴に残る可能性があります。セキュリティが重要な場合は、接続後にAUTH
コマンドを使う方が安全です。
トラブルシューティング:よくある問題
Redis CLIを使っていて遭遇する可能性のあるいくつかの一般的な問題とその解決策を紹介します。
Could not connect to Redis at 127.0.0.1:6379: Connection refused
:- 原因: Redisサーバーが起動していません。
- 解決策: Redisサーバーが起動しているか確認してください。
redis-server
コマンドを実行したり、OSのサービス管理ツールで状態を確認したりします。 - 原因: ファイアウォールが接続をブロックしています。
- 解決策: Redisサーバーがリスニングしているポート(デフォルトは6379)への接続が許可されているか、クライアント側とサーバー側の両方のファイアウォール設定を確認してください。
- 原因: Redisサーバーが異なるIPアドレスやポートで起動しています。
- 解決策:
redis-cli -h <host> -p <port>
オプションを使って正しいホストとポートを指定して接続してください。
NOAUTH Authentication required.
:- 原因: Redisサーバーにパスワード認証が設定されているのに、パスワードを指定せずに接続しようとしています。
- 解決策: 接続時に
-a <password>
オプションを使用するか、接続後にAUTH <password>
コマンドを実行してください。
WRONGTYPE Operation against a key holding the wrong kind of value
:- 原因: 存在しないキーや、特定のデータ型にしか使えないコマンドを、異なるデータ型のキーに対して実行しようとしています(例: String型以外のキーに対して
GET
を実行)。 - 解決策: 操作しようとしているキーが期待するデータ型であるか確認してください。
TYPE <key>
コマンドでキーのデータ型を確認できます。
- 原因: 存在しないキーや、特定のデータ型にしか使えないコマンドを、異なるデータ型のキーに対して実行しようとしています(例: String型以外のキーに対して
BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
:- 原因: サーバーが長時間実行されるLuaスクリプトや同期コマンド(
KEYS *
など)でブロックされています。 - 解決策: ブロックしている原因を取り除く必要があります。スクリプトの場合は
SCRIPT KILL
を試すか、データの永続化を諦めてSHUTDOWN NOSAVE
で強制停止するしかありません。KEYS *
のようなコマンドは本番環境では使わないようにしましょう。
- 原因: サーバーが長時間実行されるLuaスクリプトや同期コマンド(
OOM command not allowed when used memory > 'maxmemory'
:- 原因: Redisサーバーが設定された
maxmemory
を超えるメモリを使用しようとしており、新しいデータの書き込みコマンドが拒否されています。 - 解決策: メモリ使用量を減らす(古いキーを削除する、TTLを設定する、より小さいデータ構造を使うなど)か、
maxmemory
の設定を増やすか、データをスケールアウト(クラスター化など)する必要があります。
- 原因: Redisサーバーが設定された
これらの問題は、Redisを使い始めた頃には誰でも遭遇する可能性があります。エラーメッセージをよく読み、上記の解決策を参考にしてみてください。
次のステップ
このガイドでは、Redis CLIの基本的な使い方と、主要なデータ型を操作するためのコマンドを詳しく解説しました。これらをマスターすれば、Redisの基本的な操作や学習は十分行えるようになります。
CLIは手軽にRedisを試したり、簡単な管理タスクを行ったりするのに最適ですが、実際のアプリケーション開発では、各種プログラミング言語(Python, Java, Ruby, Node.js, PHPなど)用のRedisクライアントライブラリを使用するのが一般的です。クライアントライブラリを使うことで、アプリケーションコードからRedisサーバーに簡単に接続し、様々なコマンドを実行できるようになります。
CLIでの操作を通して、Redisのデータ型がどのように機能し、どのようなコマンドで操作できるかという基本を理解しておけば、クライアントライブラリを使った開発もスムーズに進められるでしょう。
ぜひ、今回学んだコマンドを実際にRedis CLIで入力して、動きを確認してみてください。手を動かすことが、理解への一番の近道です。
まとめ
本記事では、Redis CLIの初心者向けの使い方として、以下の内容を詳細に解説しました。
- Redis と Redis CLI の役割
- Redis CLI の起動方法とサーバーへの接続(デフォルト接続、ホスト/ポート指定、認証)
- Redis の基本概念(キー、データ型、TTL)
- どのキータイプにも使える汎用コマンド (
KEYS
,EXISTS
,DEL
,TYPE
,RENAME
,TTL
,EXPIRE
) - 各データ型ごとの主要コマンド:
- String (
SET
,GET
,MSET
,MGET
,INCR
,DECR
,APPEND
,STRLEN
) - List (
LPUSH
,RPUSH
,LPOP
,RPOP
,LRANGE
,LLEN
,LINDEX
,LREM
) - Set (
SADD
,SMEMBERS
,SISMEMBER
,SCARD
,SREM
, 集合演算) - Sorted Set (
ZADD
,ZRANGE
,ZREVRANGE
,ZRANGEBYSCORE
,ZCARD
,ZSCORE
,ZREM
) - Hash (
HSET
,HGET
,HMGET
,HGETALL
,HKEYS
,HVALS
,HLEN
,HDEL
)
- String (
- その他の便利コマンド (
SELECT
,INFO
,SHUTDOWN
,ECHO
) - CLIでのパイプライニングとトランザクションの基本
- Redis CLI 使用上のヒントとベストプラクティス
- よくあるトラブルシューティング
Redis CLIはRedisを学ぶ上での入り口であり、非常に強力なツールです。この記事で紹介したコマンドはRedis機能のほんの一部に過ぎませんが、これらを使いこなせれば、Redisの基本的な振る舞いを理解し、多くの基本的なタスクを実行できるようになります。
これで、あなたはRedis CLIを使い始めるための知識と自信を持ったはずです。恐れずにコマンドを入力し、エラーを恐れず、Redisの世界を楽しんでください!