Django 使用 Redis 缓存需配置 CACHES 的 BACKEND 为 django_redis.cache.RedisCache、LOCATION 为 redis://127.0.0.1:6379/1,并在 OPTIONS 中指定 "CLIENT_CLASS": "django_redis.client.DefaultClient",否则 cache.get() 可能静默返回 None。

怎么配 Django 的 CACHES 设置让 Redis 生效
不改对配置,Django 就不会用 Redis 缓存——哪怕你装了 redis 和 django-redis。核心是把 CACHES 字典里的 BACKEND 指向 django_redis.cache.RedisCache,且 LOCATION 必须是 Redis 实例的连接地址。
-
LOCATION推荐写成redis://127.0.0.1:6379/1(末尾/1是 DB 编号),别用localhost——某些 Docker 或云环境 DNS 解析慢或失败 - 如果 Redis 开了密码,必须加
password=xxx到 URL 里,比如redis://:mypass@127.0.0.1:6379/1 - 漏掉
OPTIONS中的"CLIENT_CLASS": "django_redis.client.DefaultClient",会导致cache.get()返回None却不报错,查半天发现是序列化没配好
为什么 cache.set() 没报错但 cache.get() 总是 None
大概率是缓存后端没真正连上 Redis,或者数据被自动丢弃。Django 默认不抛连接异常,静默降级到本地内存缓存(LocMemCache),所以看起来“能跑”,实则没走 Redis。
- 运行
python manage.py shell,手动执行from django.core.cache import cache; cache.set('test', 'ok', 30),再cache.get('test')—— 如果返回None,立刻检查cache.client.connection_pool是否能get_connection() - 确认 Redis 服务在运行:
redis-cli ping应返回PONG;若超时,看防火墙、Docker network 或 SELinux 是否拦截 - 注意
TIMEOUT设为None时,Django 会用 Redis 默认过期策略(可能被 LRU 清掉),建议显式设为整数秒
Django 的 cache_page 装饰器为啥不缓存视图
常见于用了 Class-Based View(CBV)却直接装饰类、或中间件顺序不对。这个装饰器只对函数视图生效,且依赖 UpdateCacheMiddleware 和 FetchFromCacheMiddleware 的配合。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
- 对 CBV 必须用
as_view()包裹后装饰,例如@cache_page(60*15)(MyView.as_view()),不能写在类定义上 - 确保
MIDDLEWARE中UpdateCacheMiddleware在最前,FetchFromCacheMiddleware在CommonMiddleware之后——顺序错一个位置,缓存就失效 - GET 参数不同会被当成不同缓存键,但如果你用了
csrf_token或动态 JS 时间戳,实际响应体每次变,缓存就形同虚设
如何验证 Redis 里真有缓存数据
别信日志,直接查 Redis。Django-Redis 默认用前缀 + 序列化方式存键,不手动 decode 就看不到明文值。
立即学习“Python免费学习笔记(深入)”;
- 进
redis-cli,先KEYS *看有没有带:1:views.decorators.cache.cache_page.前缀的 key(数字1来自LOCATION里的 DB 号) - 用
GET查具体 key,返回的是二进制序列化内容,可临时加"SERIALIZER": "django_redis.serializers.JSONSerializer"到OPTIONS让值变可读 - 生产环境禁用
KEYS命令(性能杀器),改用SCAN:比如SCAN 0 MATCH ":1:views*" COUNT 100
Redis 缓存不是开箱即用的魔法开关,它和 Django 的中间件链、序列化配置、网络连通性都咬得很死。最容易被忽略的是中间件顺序和 CBV 的装饰方式——这两处一错,其他全白配。

















