Django本地内存缓存LocMemCache每次请求都触发重新获取数据问题
Django LocMemCache 缓存不生效原因及排查方案
常见原因
- 未主动调用缓存逻辑:仅配置
CACHES缓存后端不会自动生效,需要主动给视图加缓存装饰器、或使用cache.set/cache.get手动操作缓存 - 缓存超时时间过短:视图缓存装饰器
cache_page传入的超时时间为0或极小值,缓存写入后立刻过期 - 进程自动重启清空缓存:
runserver默认开启代码改动自动重载功能,每次修改代码后进程重启,存在进程内存中的LocMemCache会被全部清空 - 缓存键生成规则不匹配:不同请求(不同用户、不同查询参数、不同请求方法)生成的缓存键不一致,无法命中已有缓存
- 响应头强制不缓存:视图返回的响应携带
Cache-Control: no-cache等禁用缓存的头,或请求端主动要求不缓存 - 调试组件冲突:
django-debug-toolbar等调试工具默认会禁用缓存逻辑,导致缓存不生效 - 类视图缓存装饰器使用错误:类视图不能直接添加
cache_page装饰器,需要通过method_decorator绑定到dispatch方法上
排查步骤
- 先验证缓存本身是否正常工作,在项目中执行如下测试代码:
from django.core.cache import cache # 写入测试缓存,有效期60秒 cache.set('test_cache_key', 'hello world', 60) # 读取缓存 print(cache.get('test_cache_key'))
如果输出为None,说明缓存后端配置未正确加载,检查settings.py中是否有其他覆盖CACHES配置的逻辑,确认配置加载顺序正确。
2. 验证视图缓存配置是否正确:
- 函数视图检查是否正确添加cache_page装饰器,示例:
```python
from django.views.decorators.cache import cache_page
# 配置缓存15分钟 @cache_page(60 * 15) def test_view(request): # 加打印验证视图是否被调用 print("test_view 执行") return HttpResponse("test") ``` - 类视图检查装饰器是否正确绑定到dispatch方法,示例: ```python from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page from django.views.generic import TemplateView @method_decorator(cache_page(60 * 15), name='dispatch') class TestClassView(TemplateView): template_name = "test.html" ```
- 排除自动重载影响:修改完所有代码后手动重启
runserver,第一次访问视图看控制台是否有打印,第二次访问如果没有打印说明缓存生效,仍有打印继续排查。 - 关闭调试组件测试:临时注释掉settings.py中
django-debug-toolbar相关的配置和中间件,重启服务后验证缓存是否生效。 - 检查响应头:打开浏览器开发者工具查看响应头的
Cache-Control字段,确认没有no-cache、no-store等禁用缓存的配置。
内容的提问来源于stack exchange,提问作者Anupam
相关产品推荐
相关产品推荐

