本文目录导读:

在Python中配置Redis连接池主要使用redis-py库,以下是详细的配置方法:
基础配置
import redis
# 创建连接池
pool = redis.ConnectionPool(
host='localhost',
port=6379,
db=0,
password='your_password', # 如果有密码
max_connections=10, # 最大连接数
decode_responses=True # 自动解码为字符串
)
# 使用连接池创建客户端
r = redis.Redis(connection_pool=pool)
完整参数配置
pool = redis.ConnectionPool(
host='localhost',
port=6379,
db=0,
password='your_password',
username='your_username', # Redis 6.0+ 支持
# 连接池配置
max_connections=20, # 最大连接数
min_connections=5, # 最小保持连接数(需要自定义)
timeout=30, # 连接超时秒数
socket_connect_timeout=5, # socket连接超时
socket_timeout=30, # socket读写超时
# 健康检查
health_check_interval=30, # 健康检查间隔(秒)
# 重试配置
retry_on_timeout=True, # 超时是否重试
retry_on_error=[redis.exceptions.ConnectionError], # 哪些错误类型重试
# 编解码
decode_responses=True, # 自动解码
encoding='utf-8', # 编码方式
# SSL/TLS
ssl=False, # 是否启用SSL
ssl_certfile=None, # SSL证书文件
ssl_keyfile=None, # SSL密钥文件
ssl_ca_certs=None, # CA证书文件
# 集群模式(可选)
# cluster_mode=False, # 是否集群模式
# 其他
socket_keepalive=True, # 保持连接
socket_keepalive_options={ # keepalive选项
redis.constants.TCP_KEEPIDLE: 60,
redis.constants.TCP_KEEPINTVL: 10,
redis.constants.TCP_KEEPCNT: 3
}
)
使用上下文管理器
class RedisClient:
def __init__(self, pool_config=None):
if pool_config is None:
pool_config = {
'host': 'localhost',
'port': 6379,
'db': 0,
'max_connections': 10,
'decode_responses': True
}
self.pool = redis.ConnectionPool(**pool_config)
self.redis = redis.Redis(connection_pool=self.pool)
def __enter__(self):
return self.redis
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
def close(self):
self.redis.close()
self.pool.disconnect()
# 使用示例
with RedisClient() as r:
r.set('key', 'value')
print(r.get('key'))
高级配置:自定义连接池
from redis import ConnectionPool
import redis
class CustomConnectionPool(ConnectionPool):
def __init__(self, *args, **kwargs):
# 自定义初始化逻辑
self.max_idle_time = kwargs.pop('max_idle_time', 300) # 最大空闲时间
super().__init__(*args, **kwargs)
def get_connection(self, command_name, *keys, **options):
# 自定义获取连接逻辑
connection = super().get_connection(command_name, *keys, **options)
# 可以在这里添加连接验证等逻辑
return connection
def release(self, connection):
# 自定义释放连接逻辑
super().release(connection)
# 使用自定义连接池
pool = CustomConnectionPool(
host='localhost',
port=6379,
db=0,
max_connections=20,
max_idle_time=300
)
r = redis.Redis(connection_pool=pool)
配置管理(最佳实践)
import os
import redis
from dotenv import load_dotenv
load_dotenv()
class RedisConfig:
"""Redis配置管理"""
@staticmethod
def get_pool_config():
return {
'host': os.getenv('REDIS_HOST', 'localhost'),
'port': int(os.getenv('REDIS_PORT', 6379)),
'db': int(os.getenv('REDIS_DB', 0)),
'password': os.getenv('REDIS_PASSWORD', None),
'max_connections': int(os.getenv('REDIS_MAX_CONNECTIONS', 20)),
'min_connections': int(os.getenv('REDIS_MIN_CONNECTIONS', 2)),
'socket_timeout': int(os.getenv('REDIS_SOCKET_TIMEOUT', 30)),
'socket_connect_timeout': int(os.getenv('REDIS_CONNECT_TIMEOUT', 5)),
'retry_on_timeout': True,
'decode_responses': True,
'health_check_interval': 30
}
@staticmethod
def create_pool():
config = RedisConfig.get_pool_config()
return redis.ConnectionPool(**config)
@staticmethod
def create_client():
return redis.Redis(connection_pool=RedisConfig.create_pool())
# 单例模式
redis_client = RedisConfig.create_client()
性能优化建议
# 1. 根据应用需求调整连接数
# 单线程应用:max_connections=5-10
# 多线程应用:max_connections=20-50
# 高并发应用:max_connections=100-200
# 2. 启用连接复用
pool_config = {
'max_connections': 50,
'min_connections': 10, # 保持最小连接数
'socket_keepalive': True, # 保持TCP连接
'health_check_interval': 30, # 定期健康检查
}
# 3. 使用连接池监控
def get_pool_stats(pool):
"""获取连接池状态"""
import psutil
return {
'total_connections': pool._created_connections,
'available_connections': len(pool._available_connections),
'in_use_connections': pool._in_use_connections,
'max_connections': pool.max_connections
}
# 4. 批量操作优化
with redis_client.pipeline() as pipe:
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.execute()
完整示例
import redis
from contextlib import contextmanager
class RedisManager:
"""Redis连接管理器"""
def __init__(self, **config):
self.pool = redis.ConnectionPool(**config)
self.client = redis.Redis(connection_pool=self.pool)
@contextmanager
def session(self):
"""获取Redis会话"""
try:
yield self.client
except Exception as e:
print(f"Redis错误: {e}")
raise
finally:
# 连接会自动返回到连接池
pass
def close(self):
"""关闭所有连接"""
self.client.close()
self.pool.disconnect()
@property
def stats(self):
"""获取连接池状态"""
return {
'created': self.pool._created_connections,
'available': len(self.pool._available_connections),
'in_use': self.pool._in_use_connections,
'max': self.pool.max_connections
}
# 使用示例
if __name__ == '__main__':
# 配置连接池
config = {
'host': 'localhost',
'port': 6379,
'db': 0,
'max_connections': 20,
'decode_responses': True
}
# 创建管理器
redis_manager = RedisManager(**config)
# 使用
with redis_manager.session() as r:
r.set('username', '张三')
username = r.get('username')
print(f"用户名: {username}")
print(f"连接池状态: {redis_manager.stats}")
# 关闭
redis_manager.close()
注意事项
- 连接池大小:根据并发量调整,一般设置为
N * (M-1) + 1,其中N是应用实例数,M是每个实例的线程/协程数 - 错误处理:始终实现重试和降级机制
- 资源清理:确保正确关闭连接池
- 监控告警:监控连接池使用率,设置告警阈值
- 版本兼容:注意不同redis-py版本的API差异
这样的配置可以满足大多数Redis使用场景,根据具体需求调整参数即可。