Redis

Redis入門!インメモリDBの基本と実践的な使い方

Redis

Redis入門!
インメモリDBの基本と実践的な使い方

Redisはインメモリデータストアとして、キャッシュやセッション管理に広く使われています。基本から実践まで解説します。

こんな人向けの記事です

  • Redisの基本を学びたい初心者
  • キャッシュやセッション管理の仕組みを知りたい人
  • Webアプリのパフォーマンスを改善したい人

Step 1Redisとは

Redis(Remote Dictionary Server)は、データをメモリ上に保持する高速なKey-Valueストアです。

Redisの特徴
# Redisの主な特徴
# 1. インメモリ: データをRAMに保持 → 超高速(マイクロ秒レベル)
# 2. Key-Value: キーと値のペアでデータを管理
# 3. 豊富なデータ型: String, List, Hash, Set, Sorted Set
# 4. 永続化: RDB/AOFでディスクにも保存可能
# 5. TTL: キーに有効期限を設定可能

# 主な用途
# - キャッシュ(DB問い合わせ結果、APIレスポンス)
# - セッション管理
# - リアルタイムランキング
# - メッセージキュー(Pub/Sub)
# - レート制限
RDBMSとの違い
PostgreSQLなどのRDBMSはディスクベースで複雑なクエリが可能。Redisはメモリベースで単純だが圧倒的に速い。用途に応じて使い分けましょう。

Step 2インストールと起動

ターミナル
# macOS(Homebrew)
brew install redis
brew services start redis

# Ubuntu/Debian
sudo apt update
sudo apt install redis-server
sudo systemctl start redis-server

# Docker
docker run -d --name redis -p 6379:6379 redis:alpine

# 接続テスト
redis-cli ping
# PONG ← 成功

Step 3基本データ型と操作

redis-cli
# === String(文字列) ===
SET name "田中太郎"
GET name              # "田中太郎"
SET counter 100
INCR counter          # 101(アトミックなインクリメント)
INCRBY counter 10     # 111

# === List(リスト) ===
LPUSH tasks "タスク1"
LPUSH tasks "タスク2"
RPUSH tasks "タスク3"
LRANGE tasks 0 -1     # ["タスク2", "タスク1", "タスク3"]
LPOP tasks            # "タスク2"

# === Hash(ハッシュ) ===
HSET user:1 name "田中" age 30 email "tanaka@example.com"
HGET user:1 name      # "田中"
HGETALL user:1        # name, 田中, age, 30, email, tanaka@example.com

# === Set(集合) ===
SADD tags "Python" "Django" "Redis"
SADD tags2 "Python" "Flask" "PostgreSQL"
SMEMBERS tags         # {"Python", "Django", "Redis"}
SINTER tags tags2     # {"Python"}(共通要素)

# === Sorted Set(ソート済み集合) ===
ZADD ranking 100 "Alice" 85 "Bob" 92 "Charlie"
ZREVRANGE ranking 0 -1 WITHSCORES
# Alice 100, Charlie 92, Bob 85

Step 4有効期限(TTL)

redis-cli
# キーに有効期限を設定
SET session:abc123 "user_data" EX 3600  # 3600秒(1時間)で期限切れ

# 既存キーに期限設定
SET cache:page1 "html_content"
EXPIRE cache:page1 300    # 300秒後に期限切れ

# 残り時間を確認
TTL cache:page1           # 残り秒数(-1: 期限なし, -2: 期限切れ)

# ミリ秒単位の期限
SET token:xyz "value" PX 5000  # 5000ミリ秒

# 期限を解除
PERSIST cache:page1
キャッシュ戦略
適切なTTLを設定することで、古いデータの自動削除とメモリの効率的な利用が可能です。

Step 5実践:キャッシュとセッション

redis-cli
# === キャッシュパターン ===
# APIレスポンスをキャッシュ(5分間)
SET cache:api:users "{\"users\": [...]}" EX 300

# キャッシュがあるか確認
EXISTS cache:api:users    # 1(存在する)/ 0(存在しない)

# === セッション管理 ===
# セッションをHashで管理(30分間)
HSET session:abc123 user_id 42 username "tanaka" role "admin"
EXPIRE session:abc123 1800

# セッション情報の取得
HGETALL session:abc123

# === レート制限 ===
# 1分間に最大10回のAPIアクセスを許可
SET ratelimit:user:42 0 EX 60 NX  # NX: 存在しない時のみ
INCR ratelimit:user:42
# 値が10を超えたらリクエストを拒否

# === キーの検索・削除 ===
KEYS cache:*        # パターンマッチ(本番では SCAN を使用)
DEL cache:api:users # キーの削除
FLUSHDB             # DB内の全キー削除(注意!)
KEYS コマンドに注意
KEYS *は全キーをスキャンするため、本番環境では使用禁止。代わりにSCANコマンドを使いましょう。

Step 6Pythonから使う

Python
# pip install redis
import redis
import json

# 接続
r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)

# String操作
r.set("greeting", "こんにちは", ex=3600)
print(r.get("greeting"))  # こんにちは

# キャッシュパターン
def get_user(user_id):
    cache_key = f"user:{user_id}"

    # キャッシュ確認
    cached = r.get(cache_key)
    if cached:
        return json.loads(cached)

    # DBから取得(実際はORMを使用)
    user = {"id": user_id, "name": "田中太郎"}

    # キャッシュに保存(5分間)
    r.set(cache_key, json.dumps(user), ex=300)
    return user

# Hash操作
r.hset("product:1", mapping={
    "name": "ノートPC",
    "price": "98000",
    "stock": "25"
})
print(r.hgetall("product:1"))

# Sorted Set(ランキング)
r.zadd("scores", {"Alice": 100, "Bob": 85, "Charlie": 92})
ranking = r.zrevrange("scores", 0, 2, withscores=True)
for name, score in ranking:
    print(f"{name}: {int(score)}点")

まとめ

  • Redisはインメモリの高速Key-Valueストア
  • String, List, Hash, Set, Sorted Setの5つのデータ型
  • TTLでキーの有効期限を自動管理
  • キャッシュ、セッション、ランキングに最適
  • Python redis パッケージで簡単に操作可能