Redis Strings(パート1)
Stringは最も基本的なRedisデータ型です。このレッスンでは、基本的な文字列操作コマンドについて解説します。
SETコマンドの詳細
SETコマンドはキーと値のペアを設定し、最も一般的に使用されるRedisコマンドです。
基本的な使用方法
REDIS
SET mykey "Hello Redis"
OK
正常にSETされるとOKが返ります。
SETコマンドのパラメータ
SETはさまざまな設定戦略のための複数のオプションパラメータをサポートしています:
REDIS
# EX:有効期限を秒単位で設定
SET session:token "user_data" EX 3600
# PX:有効期限をミリ秒単位で設定
SET cache:key "value" PX 60000
# NX:キーが存在しない場合のみ設定
SET lock:resource "locked" NX
# XX:キーが存在する場合のみ設定
SET counter 100 XX
# 組み合わせ:有効期限付きのロックを設定
SET lock:order:123 "locked" NX EX 10
パラメータリファレンス
| パラメータ | 説明 | 例 |
|---|---|---|
| EX seconds | 有効期限を秒単位で設定 | SET key value EX 60 |
| PX milliseconds | 有効期限をミリ秒単位で設定 | SET key value PX 60000 |
| EXAT timestamp | 有効期限のUnixタイムスタンプ(秒) | SET key value EXAT 1700000000 |
| PXAT timestamp | 有効期限のUnixタイムスタンプ(ミリ秒) | SET key value PXAT 1700000000000 |
| NX | キーが存在しない場合のみ設定 | SET key value NX |
| XX | キーが存在する場合のみ設定 | SET key value XX |
| GET | 古い値を返す(Redis 6.2+) | SET key value GET |
| KEEPTTL | 既存のTTLを保持 | SET key value KEEPTTL |
💡 分散ロックの実装:
SET lock:resource "value" NX EX 10 は分散ロックを実装する古典的な方法です。NXがアトミック性を保証し、EXがデッドロックを防止します。
例:分散ロックの実装
BASH
# ロックを取得(ロックが存在しない場合のみ設定、10秒後に自動解放)
SET lock:product:123 "order_process" NX EX 10
# ロックを解放(キーを削除)
DEL lock:product:123
GETコマンドの詳細
GETコマンドはキーの値を取得します。
基本的な使用方法
REDIS
SET mykey "Hello Redis"
GET mykey
"Hello Redis"
キーが存在しない場合
REDIS
GET notexist
(nil)
キーが存在しない場合は(nil)が返ります。
GETコマンドのバリエーション
REDIS
# GETSET:古い値を取得し、新しい値を設定
SET counter 100
GETSET counter 0
"100" # 古い値を返す
GET counter
"0" # 新しい値に更新
# GETRANGE:文字列の部分文字列を取得
SET message "Hello Redis World"
GETRANGE message 0 4
"Hello"
GETRANGE message 6 10
"Redis"
⚠️ 補足: GETRANGEのインデックスは0から始まり、終了位置を含みます。
GETRANGE key 0 4 は0〜4の位置の文字を取得します(合計5文字)。
DEL - キーの削除
DELコマンドは1つ以上のキーを削除します。
単一キーの削除
REDIS
SET temp "temporary"
DEL temp
(integer) 1 # 削除されたキーの数を返す
複数キーの削除
REDIS
SET key1 "value1"
SET key2 "value2"
SET key3 "value3"
DEL key1 key2 key3
(integer) 3 # 3つのキーを削除
存在しないキーの削除
REDIS
DEL notexist
(integer) 0 # 0個のキーを削除
💡 戻り値: DELは実際に削除されたキーの数を返します。削除した値は返しません。
MSETとMGETのバッチ操作
MSETとMGETは、一度に複数のキーと値のペアを設定または取得でき、ネットワークラウンドトリップを削減します。
MSET バッチ設定
REDIS
MSET user:1:name "Alice" user:1:age "25" user:1:city "Beijing"
OK
# 以下と同等
SET user:1:name "Alice"
SET user:1:age "25"
SET user:1:city "Beijing"
MGET バッチ取得
REDIS
MGET user:1:name user:1:age user:1:city
1) "Alice"
2) "25"
3) "Beijing"
# 存在しないキーを含む場合
MGET user:1:name user:1:email user:1:age
1) "Alice"
2) (nil) # キーが存在しない
3) "25"
MSETNX:どのキーも存在しない場合のみ設定
REDIS
# どのキーも存在しない場合のみ設定
MSETNX key1 "value1" key2 "value2"
(integer) 1 # 成功
# 再度試行(key1とkey2はすでに存在)
MSETNX key1 "new1" key3 "value3"
(integer) 0 # 失敗、key1はすでに存在
# 確認:key3は設定されていない
GET key3
(nil)
⚠️ 補足: MSETNXはアトミックです。すべて成功するか、すべて失敗します。
STRLEN - 長さを取得
STRLENは文字列値の長さを返します(バイト単位)。
基本的な使用方法
REDIS
SET mykey "Hello Redis"
STRLEN mykey
(integer) 11
SET text "Hello"
STRLEN text
(integer) 5
キーが存在しない場合
REDIS
STRLEN notexist
(integer) 0
APPEND - 文字列に追加
APPENDコマンドは文字列の末尾に内容を追加します。
基本的な使用方法
REDIS
SET mykey "Hello"
APPEND mykey " Redis"
(integer) 11 # 追加後の合計長さを返す
GET mykey
"Hello Redis"
存在しないキーに追加
REDIS
APPEND newkey "value"
(integer) 5 # SET newkey "value" と同等
GET newkey
"value"
💡 使用例: APPENDはログの構築やURLの連結などに使用できます。
Stringのユースケース
ユースケース1:キャッシュ
REDIS
# APIレスポンスをキャッシュ
SET cache:api:user:1 '{"name":"Alice","age":25}' EX 300
# キャッシュデータを取得
GET cache:api:user:1
ユースケース2:セッションストレージ
REDIS
# ユーザーセッションを保存(30分の有効期限)
SET session:token:abc123 '{"user_id":1,"role":"admin"}' EX 1800
# セッションを検証
GET session:token:abc123
ユースケース3:分散ロック
REDIS
# ロックを取得(10秒後に自動解放)
SET lock:order:process "server1" NX EX 10
# OKが返ったらロック取得成功
# nilが返ったらロックは別のプロセスが保持
# ロックを解放
DEL lock:order:process
ユースケース4:確認コード
REDIS
# 確認コードを保存(5分の有効期限)
SET code:phone:13800138000 "123456" EX 300
# 確認
GET code:phone:13800138000
ユースケース5:レート制限
REDIS
# APIアクセス数を記録(1分間のウィンドウ)
SET limit:api:user:1 "0" EX 60
# アクセスごとに増加(INCRと組み合わせて使用)
Stringのエンコーディング最適化
Redisは文字列の内容に基づいて最適なエンコーディングを自動的に選択します:
| エンコーディング | 条件 | 説明 |
|---|---|---|
| int | long範囲内の整数値 | 整数エンコーディング、メモリ節約 |
| embstr | 文字列長 <= 44バイト | 埋め込み文字列、コンパクトな保存 |
| raw | 文字列長 > 44バイト | 通常の文字列、SDSを使用 |
エンコーディングタイプの確認
REDIS
SET intkey 12345
OBJECT ENCODING intkey
"int"
SET shortkey "Hello"
OBJECT ENCODING shortkey
"embstr"
SET longkey "This is a very long string that exceeds 44 bytes limit"
OBJECT ENCODING longkey
"raw"
ℹ️ 補足: エンコーディングはRedisによって自動的に選択されます。手動での操作は不要です。エンコーディングを理解することでメモリ使用の最適化に役立ちます。
❓ よくある質問
Q SETは既存のキーを上書きしますか?
A はい。デフォルトでは、SETは既存のキーを上書きします。キーが存在しない場合のみ設定するにはNXパラメータを使用してください。
Q 「キーが存在する場合のみ更新」を実装するにはどうすればよいですか?
A SETのXXパラメータを使用します:
SET key value XX。キーがすでに存在する場合のみ新しい値を設定します。Q MSETと複数のSETの違いは何ですか?
A MSETはアトミックな操作で、1回のネットワークラウンドトリップで複数の設定を完了するため、より効率的です。複数のSETは複数のラウンドトリップが必要です。
Q Stringの最大サイズは?
A 最大512MBです。ただし、非常に大きな文字列を保存するとパフォーマンスとメモリに影響するため、推奨されません。
Q バイナリデータ(画像など)を保存するにはどうすればよいですか?
A Redisの文字列はバイナリセーフで、直接保存できます。ただし、画像URLを保存するか、専用のファイルストレージサービスを使用することを推奨します。
📖 まとめ
- SETはキーと値のペアを設定し、EX/PX/NX/XXパラメータをサポート
- GETは値を取得し、キーが存在しない場合はnilを返す
- DELはキーを削除し、実際に削除された数を返す
- MSET/MGETはバッチ操作用で、ネットワークラウンドトリップを削減
- STRLENは文字列の長さを取得し、APPENDは文字列に追加
- Stringはキャッシュ、セッション、分散ロック、確認コードによく使用される
- Redisは最適なエンコーディング(int/embstr/raw)を自動的に選択
📝 練習問題
- 基本操作: SETを使用して自分の名前、年齢、都市を保存し、MGETで一度に取得しましょう
- 有効期限の練習: TTL付きのキーを設定し、TTLで残り時間を確認しましょう
- 分散ロック: SET NX EXを使用してシンプルな分散ロックを実装し、取得と解放を試してみましょう
- バッチ操作: MSETで10個のキーを設定し、MGETでそのうち5個を取得しましょう
次のレッスン
次のレッスンでは、Redis Strings(パート2)について学びます。数値演算とビット演算を解説します。



