如何为Django配置Memcached?配置后无缓存效果求助
Django Memcached缓存未生效排查方案
1. 修正配置参数类型错误
你的CACHE_MIDDLEWARE_SECONDS设置为字符串'6000',Django要求该参数必须是整数,字符串类型会被中间件忽略,直接导致全局缓存不生效。修改为:
CACHE_MIDDLEWARE_SECONDS = 6000
2. 验证全局缓存的生效条件
全局缓存中间件仅对符合以下所有条件的请求生效:
- 请求方法为
GET或HEAD - 响应状态码为
200 - 请求未携带Cookie(如用户登录状态下的session cookie会触发缓存跳过逻辑)
- 响应头
Cache-Control未设置private、no-cache等禁用缓存的指令
3. 检查缓存读写状态
方式1:视图内调试缓存命中情况
在目标视图中添加代码,直接检查缓存键是否存在:
from django.core.cache import cache def your_api_view(request): # 模拟全局缓存的键生成规则(可根据实际调整) cache_key = f"views.decorators.cache.cache_page.{CACHE_MIDDLEWARE_SECONDS}.{request.path}" if cache.get(cache_key): print("[DEBUG] 缓存命中") else: print("[DEBUG] 缓存未命中,重新生成响应") # 你的视图业务逻辑 ...
启动服务后调用接口,查看控制台输出判断缓存是否正常写入。
方式2:通过Memcached命令行验证
用telnet连接Memcached后,执行以下命令查看缓存条目:
telnet 127.0.0.1 11211 stats items # 查看缓存条目统计 stats cachedump 0 # 列出所有缓存键
如果没有任何缓存键输出,说明缓存未被写入。
4. 确认依赖与后端配置
你使用的是PyMemcacheCache后端,必须确保已安装pymemcache依赖:
pip install pymemcache
若未安装,Django会自动 fallback到本地内存缓存(LocMemCache),多进程部署下缓存不共享,也会导致后续调用无性能提升。
5. 单独测试视图缓存
暂时注释掉全局缓存中间件,用@cache_page装饰器单独测试目标视图:
from django.views.decorators.cache import cache_page @cache_page(6000) def your_api_view(request): ...
如果单独视图缓存生效,说明全局缓存的条件未满足(如请求带Cookie);如果仍不生效,需检查Memcached服务连接或后端配置。
6. 检查中间件顺序与响应修改
确保UpdateCacheMiddleware在所有可能修改响应的中间件之前(你的当前配置顺序正确),避免后续中间件修改响应头(如添加Set-Cookie或修改Cache-Control)导致缓存失效。
内容的提问来源于stack exchange,提问作者Nightrain
相关产品推荐
相关产品推荐

