Django 集成 Redis 缓存需在 settings.py 中配置 CACHES,将 BACKEND 设为 django_redis.cache.RedisCache 并确保 Redis 服务可达。配置错误会导致 Django 静默降级到本地内存缓存,看似运行正常实则未生效。
先说结论:Django 通过 django-redis 包集成 Redis,核心是正确配置 CACHES 字典并在视图中调用 cache 接口,配置缺失会导致缓存静默失效。
- 先定位:确认数据库查询是性能瓶颈,而非网络或前端渲染问题
- 先做:安装 django-redis 并配置 BACKEND 为 django_redis.cache.RedisCache
- 再验证:使用 redis-cli 和 Django shell 确认缓存命中而非本地内存
命令速用版
安装依赖并检查 Redis 服务状态,确保环境就绪。
pip install django-redis
redis-cli ping
# 应返回 PONG为什么会这样
数据库通常是 Web 应用的性能瓶颈,缓存通过内存存储减少数据库直接访问。Django 默认配置下若 Redis 连接失败,可能静默降级到本地内存缓存(LocMemCache),导致多进程环境下缓存不共享且看似无报错。
引入 Redis 后,频繁访问的数据存储在内存中,读写速度显著高于磁盘数据库。但必须显式配置后端类,否则 Django 不会自动使用 Redis。
分步处理
按顺序完成安装、配置和代码修改,每步需检查确认。
1. 安装依赖
使用 pip 安装 django-redis,这是 Django 官方推荐的 Redis 后端实现。
pip install django-redis2. 配置 settings.py
在 CACHES 字典中指定 BACKEND 和 LOCATION,LOCATION 推荐使用 127.0.0.1 而非 localhost 以避免 DNS 解析问题。若 Redis 有密码,需写入 URL 中。
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}3. 视图层使用
在视图中通过 django.core.cache 导入 cache 对象,先 get 后 set,设置合理的 timeout 避免数据永久驻留。
from django.core.cache import cache
def product_list(request):
products = cache.get('all_products')
if not products:
products = Product.objects.all()
cache.set('all_products', products, timeout=300)
return render(request, 'list.html', {'products': products})怎么验证是否生效
不要仅依赖日志,需直接检查 Redis 实例数据和 Django 缓存行为。
1. Django Shell 测试
进入 shell 手动 set 和 get,若返回 None 则配置未生效。
python manage.py shell
from django.core.cache import cache
cache.set('test', 'ok', 30)
cache.get('test') # 应返回 'ok'2. Redis 客户端检查
使用 redis-cli 查看键值,django-redis 默认会对键进行序列化,可能看不到明文值,但能确认键存在。
redis-cli
keys *常见坑
以下配置错误会导致缓存功能异常或静默失败。
- 缺少 CLIENT_CLASS:OPTIONS 中漏配 CLIENT_CLASS 会导致 cache.get() 静默返回 None 且不报错
- CBV 装饰错误:cache_page 装饰器对类视图需包裹 as_view(),直接装饰类无效
- 中间件顺序:全站缓存需确保 UpdateCacheMiddleware 在最前,FetchFromCacheMiddleware 在 CommonMiddleware 之后
- 动态内容干扰:URL 中包含 csrf_token 或动态时间戳会导致缓存键频繁变化,缓存命中率低
常见问题
cache.set 没报错但 get 总是 None 怎么办
大概率是缓存后端未真正连接 Redis 或序列化配置错误。检查 cache.client.connection_pool 是否能获取连接,并确认 Redis 服务正在运行且防火墙未拦截。
类视图(CBV)如何配置页面缓存
必须使用 as_view() 包裹后再装饰,例如 @cache_page(60*15)(MyView.as_view()),不能直接写在类定义上。
Redis 密码如何在配置中填写
在 LOCATION 连接字符串中加入密码,格式为 redis://:password@127.0.0.1:6379/1。
参考来源
- Django 怎么集成 Redis 缓存_Python 配置 Cache backend 提升响应速度
- 《Django Redis 缓存:页面加载速度提升 3 倍》
- Python 100 天,从新手到大师——Django 缓存深度解析:从 Redis 到性能优化实战 (day56)
- django-redis:Django 项目性能提升的终极 Redis 缓存解决方案
- 如何快速集成 django-redis:5 分钟完成 Django 缓存配置终极指南
- Django 缓存系统优化:Redis 缓存与页面片段缓存的结合使用
- Django 缓存后端配置指南 (Redis/Memcached)