清空Redis键后Django REST framework仍返回缓存数据问题求助
问题根因
你观察到的现象和Redis侧缓存无关,是浏览器端强缓存导致的:Django原生的cache_page装饰器默认会给GET响应附加Cache-Control头,告知浏览器在缓存有效期内直接读取本地磁盘/内存缓存,不会向后端发送任何请求,所以你清理Redis、甚至关闭Redis服务的操作都不会生效——请求根本没有到达DRF服务器。这个现象是HTTP缓存标准规则下的正常行为,不是DRF或django-redis的故障。
解决方案
方法1:禁用浏览器强缓存(推荐,匹配你的预期需求)
给cache_page装饰器追加缓存控制参数,强制浏览器每次请求都必须到达后端,由后端判断Redis缓存是否有效:
from django.views.decorators.cache import cache_page from django.utils.decorators import method_decorator # 此处以给list接口加缓存为例,60*15是缓存有效期15分钟,可按需调整 @method_decorator(cache_page(60 * 15, cache_control={"no_cache": True}), name='list') class ProductViewSet(ModelViewSet): # 你的原有视图逻辑
这里的cache_control={"no_cache": True}会给响应头加上Cache-Control: no-cache,含义是浏览器可以存储响应缓存,但每次使用前必须向后端确认缓存是否有效,不会再直接返回本地缓存。
方法2:搭配协商缓存优化性能
如果希望兼顾性能,可以同时开启DRF的条件请求支持,配合ETag实现协商缓存:
from rest_framework.viewsets import ModelViewSet from rest_framework.mixins import ConditionalGetMixin class ProductViewSet(ConditionalGetMixin, ModelViewSet): # 原有逻辑
这种模式下浏览器会发送If-None-Match头携带缓存的ETag值,后端如果判断Redis缓存有效且内容未变更,会直接返回304状态码告知浏览器用本地缓存,既保证了数据一致性,也能减少传输开销。
验证方式
你可以临时打开浏览器开发者工具的「网络」标签,勾选「禁用缓存」选项后重新发送请求,此时请求会直接到达后端,能正常返回更新后的数据,即可验证问题根源确实是浏览器本地缓存。
内容的提问来源于stack exchange,提问作者Ryan Aquino
相关产品推荐
相关产品推荐

