在高并发场景下,将 Django 会话存储从数据库迁移到 Redis 是提升响应速度的有效手段,适合读写频繁且对持久化要求不苛刻的业务。
先说结论:使用 Redis 存储 Session 能显著减少数据库 IO 压力,但需正确配置后端引擎与缓存别名,并注意数据持久化风险。
- 适合:多服务器部署或高并发访问场景
- 先准备:安装 Redis 服务及 django-redis 包
- 验收:确认登录状态持久化且 Redis 中有对应键(使用 SCAN 命令)
环境准备
确保本地或服务器已安装 Redis 服务,并在 Django 项目环境中安装依赖包。
# 安装依赖包
pip install django-redis# 检查 Redis 服务是否运行
redis-cli ping
# 返回 PONG 表示成功核心配置
在 settings.py 中完成缓存后端与会话引擎的配置。注意显式设置 TIMEOUT 避免缓存无限增长,若有密码需在 OPTIONS 中配置。
CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache','LOCATION': 'redis://127.0.0.1:6379/1','OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient','PASSWORD': 'your_password', # 若有密码则填写,无则删除'SOCKET_CONNECT_TIMEOUT': 5, # 防止连接阻塞},'TIMEOUT': 1209600, # 默认过期时间(秒),避免键永不过期}
}SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'# 若担心数据丢失,可使用 cached_db 模式(缓存 + 数据库双写)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'验证方法
配置完成后,通过以下方式验证会话是否已存入 Redis。
1. 命令行安全检查
登录服务器,使用 scan 命令替代 keys,避免在大键量生产环境中阻塞 Redis 服务。
redis-cli
# 使用 scan 命令模糊匹配 session 键,count 限制每次扫描数量
scan 0 match "session*" count 102. 功能测试
在浏览器登录账号,关闭浏览器后重新打开(在未过期时间内),检查是否保持登录状态。同时观察数据库 django_session 表是否不再新增记录(纯 cache 模式下)。
常见坑与排查
1. 会话丢失风险
纯缓存模式(cache)下,Redis 重启会导致 Session 丢失。生产环境建议使用 cached_db 模式,或确保 Redis 开启 AOF/RDB 持久化配置。
2. 连接池配置
高并发下需合理设置连接池参数,避免连接耗尽。若遇到 Connection refused 或超时,检查 SOCKET_CONNECT_TIMEOUT 及 Redis 最大连接数限制。
3. 中间件配置
确保 MIDDLEWARE 列表中包含 django.contrib.sessions.middleware.SessionMiddleware。此前关于全站缓存中间件顺序的建议不适用于会话缓存配置,请勿混淆。
生产环境建议
1. 安全配置
Redis 服务不应直接暴露在公网,建议绑定内网 IP 并设置强密码。在 LOCATION 或 OPTIONS 中正确配置密码认证。
2. 性能监控
关注 Redis 内存使用率及键过期策略。可通过 Django 调试工具或 Redis 监控面板观察缓存命中率,若命中率过低需检查会话过期时间设置。
参考文档
- Django Official Docs: Sessions
- django-redis GitHub Repository
- Redis Official Docs: SCAN command
原文链接:https://www.zjcp.cc/ask/10891.html
