Redisのユースケース:キャッシュ、キュー、レート制限

Backend2026-10-04TryQuickToolBox

あなたのWebアプリは traction を獲得していますが、今やページロードのたびにデータベースにアクセスし、バックグラウンドジョブが溜まり、一部のユーザーがAPIを叩きまくっています。これらの課題に対処するには、高速なインメモリデータストアが必要です。Redisは、キャッシュ、キュー、レート制限のための定番ソリューションです。この記事では、これら3つのコアユースケースを実践的な例とベストプラクティスとともに探ります。

なぜキャッシュ、キュー、レート制限にRedisなのか?

Redisは、その速度と汎用性で知られるインメモリのキーバリューストアです。文字列、リスト、セット、ソート済みセット、ハッシュなどの豊富なデータ構造をサポートしており、多様なタスクに最適です。そのアトミック操作とpub/sub機能は、さらにその有用性を拡張します。データベース負荷の軽減、サービスの分離、APIの保護など、Redisはシンプルかつ強力なツールキットを提供します。

1. Redisによるキャッシュ

キャッシュはRedisの最も一般的なユースケースです。頻繁にアクセスされるデータをメモリに保存することで、レイテンシとデータベース負荷を軽減します。RedisのTTL(time-to-live)機能は、古いデータを自動的に期限切れにします。

キャッシュの実装方法

  1. キャッシュをチェック:データベースにクエリする前に、データがRedisに存在するか確認します。
  2. キャッシュミスの場合:データベースから取得し、有効期限を設定して結果をRedisに保存します。
  3. キャッシュヒットの場合:キャッシュされたデータを直接返します。

以下はredis-pyを使用したPythonの例です:

import redis
import json

r = redis.Redis(host='localhost', port=6379, db=0)

def get_user(user_id):
    cache_key = f"user:{user_id}"
    cached = r.get(cache_key)
    if cached:
        return json.loads(cached)
    # Simulate DB fetch
    user = fetch_user_from_db(user_id)
    r.setex(cache_key, 3600, json.dumps(user))  # Cache for 1 hour
    return user

キャッシュのベストプラクティス

2. Redisによるキュー

Redisのリストとソート済みセットは、シンプルでありながら堅牢なメッセージキューを可能にします。バックグラウンドジョブ、タスクキュー、イベント処理に最適です。専用のメッセージブローカーとは異なり、Redisキューは軽量でセットアップが簡単です。

基本的なキューの実装

LPUSHでジョブを追加し、BRPOPでブロッキング方式で消費します:

# Producer
r.lpush('job_queue', json.dumps({'task': 'send_email', 'to': 'user@example.com'}))

# Consumer
while True:
    _, job = r.brpop('job_queue', timeout=30)
    if job:
        process_job(json.loads(job))

ソート済みセットを使った高度なキュー

遅延ジョブや優先度キューの場合、スコアとしてタイムスタンプを持つソート済みセットを使用します。コンシューマーはスコアを持つジョブを取得します