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",
}