要确认@cache_page真在用redis,需验证三点:①中间件顺序是否正确(updatecachemiddleware最前、fetchfromcachemiddleware紧随commonmiddleware之后);②视图是否为函数视图或经as_view()包装的cbv;③执行cache.client.connection_pool.get_connection().connect()不抛异常,且redis-cli keys "view"可查到缓存键。

cache_page装饰器不生效,怎么确认它真在用Redis?
不是装了django-redis、配了CACHES就自动生效——@cache_page只对函数视图或as_view()调用有效,且严重依赖中间件顺序。
-
UpdateCacheMiddleware必须排在MIDDLEWARE最前面,FetchFromCacheMiddleware必须紧挨着CommonMiddleware之后、SecurityMiddleware之前;中间插一个SessionMiddleware或AuthenticationMiddleware都会导致缓存跳过 - 类视图不能直接在类上加
@cache_page,得写成path('api/', cache_page(900)(MyView.as_view())) - GET参数(如
?page=2)会自动参与缓存键生成,但Cookie、Authorization头默认不参与——登录页用cache_page基本无效,得换cache.set()手动控制
CACHES配置写错,为什么cache.get()总返回None?
静默失败是最大坑点:Django默认不报连接错误,而是悄悄降级到LocMemCache(进程内内存缓存),你测cache.set()和cache.get()都像正常,其实根本没走Redis。
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
-
LOCATION必须带协议头:redis://127.0.0.1:6379/1,不能只写127.0.0.1:6379;末尾/1是Redis DB编号,漏掉会连到DB 0,可能被其他服务覆盖 - 开了密码必须写全:
redis://:mypass@127.0.0.1:6379/1,冒号前留空表示无用户名 -
OPTIONS里缺"CLIENT_CLASS": "django_redis.client.DefaultClient",会导致序列化失败,cache.get()返回None却不报错 - 验证方式:进
python manage.py shell,执行cache.client.connection_pool.get_connection().connect()——抛异常才是真连不上
手动缓存查询结果,key怎么设计才不冲突?
别用固定字符串当key,比如'all_products'——多个视图共用同一个key,一删全崩;也别拼接用户ID但忘了处理特殊字符,导致Redis键名非法。
- 用
cache.make_key()生成安全key:cache.make_key(f'products_list_{request.user.id}', version=1) - 敏感数据(如用户私有列表)必须把
request.user.id或request.session.session_key纳入key,否则A用户看到B用户的缓存 - timeout别设为
None:Redis默认不过期,但内存满时按LRU策略清掉,实际失效时间不可控;显式设整数秒(如300)更可靠 - 更新数据时主动
cache.delete_pattern('products_*')或cache.delete(key),别等超时
Session存Redis后频繁登出,是不是Redis不稳定?
不是Redis问题,是Session生命周期没对齐。Django默认Session有效期1209600秒(2周),但Redis key若没设TTL,就永不过期;反过来,如果Redis内存紧张被LRU清掉,Session就丢了。
- 必须设
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'——缓存+DB双写,既快又防丢 -
SESSION_CACHE_ALIAS = 'default'要指向你配的Redis缓存alias,别漏 -
SESSION_COOKIE_AGE和SESSION_SAVE_EVERY_REQUEST = True配合使用,避免用户长时间不动导致Session被Redis提前清理 - 检查Redis info:运行
redis-cli info | grep used_memory_human,如果接近maxmemory,就得调大或优化key过期策略
redis-cli keys *看不到明文,调试时容易误判“没存进去”——真要查,得用redis-cli --raw keys "prefix:*" | xargs -I {} redis-cli --raw get {},或者在Django里用cache._cache.keys('*')(仅开发环境)。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










