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を保存するか、専用のファイルストレージサービスを使用することを推奨します。

📖 まとめ

📝 練習問題

  1. 基本操作: SETを使用して自分の名前、年齢、都市を保存し、MGETで一度に取得しましょう
  2. 有効期限の練習: TTL付きのキーを設定し、TTLで残り時間を確認しましょう
  3. 分散ロック: SET NX EXを使用してシンプルな分散ロックを実装し、取得と解放を試してみましょう
  4. バッチ操作: MSETで10個のキーを設定し、MGETでそのうち5個を取得しましょう

次のレッスン

次のレッスンでは、Redis Strings(パート2)について学びます。数値演算とビット演算を解説します。

100%