Django 缓存机制 Redis 后端怎么配置?页面加载速度怎么提升?

文章导读
Django 集成 Redis 缓存需在 settings.py 中配置 CACHES,将 BACKEND 设为 django_redis.cache.RedisCache 并确保 Redis 服务可达。配置错误会导致 Django 静默降级到本地内存缓存,看似运行正常实则未生效。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

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-redis

2. 配置 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 缓存机制 Redis 后端怎么配置?页面加载速度怎么提升?

在视图中通过 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)