PythonからRedisを操作する包括的ガイド

PythonからRedisを操作するには、主に2つのアプローチがあります。本ガイドでは基本的な接続方法からデータ操作、Djangoとの連携までを解説します。

1. 直接接続(redis-py)

まずは redis ライブラリをインストールします。

pip install redis

基本的な接続方法は以下の2通りです。

import redis

# 直接接続
client = redis.Redis(host='127.0.0.1', port=6379)
client.set('foo', 'Bar')
print(client.get('foo'))

# コネクションプールを利用
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
client = redis.Redis(connection_pool=pool)
client.set('bar', 'Foo')
print(client.get('bar'))

コネクションプールは事前に複数の接続を確立して再利用する仕組みです。高負荷時に接続の作成・破棄のオーバーヘッドを削減し、パフォーマンスを向上させます。

データベース選択と自動デコード

pool = redis.ConnectionPool(
    host="127.0.0.1",
    port=6379,
    db=0,
    decode_responses=True  # レスポンスを自動で文字列にデコード
)
client = redis.Redis(connection_pool=pool)

decode_responses=True を設定すると、Redisからの応答が自動的に文字列に変換されます。これにより bytes 型の手動デコードが不要になります。

主要なデータ操作

文字列操作

# setnx: キーが存在しない場合のみ設定
result = client.setnx("name", "bruce")  # 既存ならFalse、新規ならTrue
print(result)

# setex: 有効期限付きで設定(10秒後に自動削除)
client.setex("good_01", 10, '2')

# incrby: 数値のインクリメント
client.set("age", 10)
client.incrby("age", 2)
print(client.get('age'))  # 12

ハッシュ操作

# 単一フィールド設定
client.hset("person", "name", "bruce")
print(client.hget("person", "name"))

# 複数フィールド設定
client.hmset("person", {"name": "bruce", "age": 18})

# フィールド取得
print(client.hmget("person", "name", "age"))
print(client.hgetall('person'))

リスト操作

# 右側に要素を追加(rpush)
client.rpush('scores', 100, 90, 80)

# 左側に要素を追加(lpush)
client.lpush('point', 90, 99, 121)

# 範囲指定で取得
print(client.lrange('point', 0, -1))  # ['121', '99', '90']

# 要素の挿入
client.linsert("scores", "AFTER", "100", 95)  # 100の後ろに95
client.linsert('scores', 'BEFORE', 95, 12344)  # 95の前に12344

# 要素の取り出しと削除
client.lpop('scores')  # 左から取り出し
client.rpop('scores')  # 右から取り出し

# インデックス指定で取得
print(client.lindex("scores", 1))

セット操作

# 要素追加
client.sadd('name_set', 'zhagnshan', 'lisi', 'wnagweu')
print(client.smembers('name_set'))  # {'zhagnshan', 'lisi', 'wnagweu'}

# ランダム取得
print(client.srandmember("name_set", 2))

# 要素削除
client.srem('name_set', 'lisi')
print(client.smembers('name_set'))  # {'zhagnshan', 'wnagweu'}

ソート済みセット操作

# スコア付きで要素追加
client.zadd('names', {'bruce':80, 'li':22, 'zhao':100})

# 昇順(デフォルト)
print(client.zrange('names', 0, -1))  # ['li', 'bruce', 'zhao']

# スコアも含めて取得
print(client.zrange("names", 0, -1, withscores=True))
# [('li', 22.0), ('bruce', 80.0), ('zhao', 100.0)]

# 降順
print(client.zrevrange('names', 0, -1, withscores=True))
# [('zhao', 100.0), ('bruce', 80.0), ('li', 22.0)]

# スコア範囲指定
print(client.zrangebyscore('names',50,100,withscores=True))
# [('bruce', 80.0), ('zhao', 100.0)]

# 要素削除
client.zrem("names", "bruce")
print(client.zrange('names',0,-1))  # ['li', 'zhao']

キー操作

client.delete("scores")          # キー削除
print(client.exists("scores"))   # 存在確認
print(client.keys("*"))          # 全キー一覧
client.expire("name", 10)        # 有効期限設定(秒)

2. Djangoからの操作(django-redis)

DjangoプロジェクトでRedisを使用するには django-redis をインストールします。

pip install django-redis

基本設定

settings.py でCACHESを設定します。

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

複数のRedis接続を定義する場合は、別名を変えて追加します。

セッションストアの切り替え

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

タイムアウト設定

CACHES = {
    "default": {
        "OPTIONS": {
            "SOCKET_CONNECT_TIMEOUT": 5,  # 接続タイムアウト(秒)
            "SOCKET_TIMEOUT": 5,          # 読み書きタイムアウト(秒)
        }
    }
}

使用方法

デフォルトキャッシュを使用

from django.core.cache import cache

cache.set("name", "icy_hope", timeout=None)
print(cache.get("name"))

特定のRedis接続を指定(ネイティブRedisクライアント)

from django_redis import get_redis_connection

redis_conn = get_redis_connection("default")
redis_conn.set("name", "icy_hope")
print(redis_conn.get("name"))

get_redis_connection() が返すクライアントはネイティブRedisクライアントです。返り値はデフォルトで bytes 型となるため、必要に応じてデコードしてください。

コネクションプールの設定

最大接続数の指定

CACHES = {
    "default": {
        "OPTIONS": {
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    }
}

プールの使用例

from django_redis import get_redis_connection

redis_conn = get_redis_connection("default")
redis_conn.set("name", "icy_hope")
print(redis_conn.get("name"))

# 作成済み接続数の確認
connection_pool = redis_conn.connection_pool
print(connection_pool._created_connections)

カスタムコネクションプール

独自のプールクラスを作成する場合は redis.connection.ConnectionPool を継承します。

from redis.connection import ConnectionPool

class MyPool(ConnectionPool):
    pass

設定ファイルで指定します。

"OPTIONS": {
    "CONNECTION_POOL_CLASS": "your_app.MyPool",
}

参考リンク

タグ: redis Python Django redis-py django-redis

7月20日 20:25 投稿