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 85Step 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 パッケージで簡単に操作可能