You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest Framework序列化器响应缓存更新失效方案咨询

DRF 嵌套关联资源缓存失效标准实践

DRF 自带及第三方扩展提供的缓存装饰器默认仅基于请求参数生成缓存键,无内置关联数据变更时的自动失效逻辑,目前行业通用的落地实践有以下三类:


1. 信号触发显式缓存清理(最常用)

这是官方文档提及的推荐适配方案,实现逻辑如下:

  • 首先统一自定义缓存键生成规则,避免使用默认的随机键逻辑,确保可以精准定位到待清理的缓存条目。如果你使用的是drf-extensions的cache_response装饰器,可以通过key_func参数指定全局统一的键生成规则,示例规则如下:
    def session_detail_key_func(view_instance, args, kwargs):
        return f"session:detail:{kwargs['pk']}"
    
  • 为Session本身及所有关联的模型(User/Experiment/Event/SessionAnswer)绑定post_save、post_delete信号,当模型数据变更时,反向查询所有关联的Session主键,删除对应缓存键即可,示例代码:
    from django.db.models.signals import post_save, post_delete
    from django.dispatch import receiver
    from django.core.cache import cache
    from yourapp.models import Session, User, Experiment, Event, SessionAnswer
    
    @receiver([post_save, post_delete], sender=Session)
    def clear_session_cache(sender, instance, **kwargs):
        cache.delete(f"session:detail:{instance.pk}")
    
    @receiver(post_save, sender=User)
    def clear_session_cache_by_user(sender, instance, **kwargs):
        session_ids = Session.objects.filter(user_id=instance.pk).values_list("pk", flat=True)
        for sid in session_ids:
            cache.delete(f"session:detail:{sid}")
    
    @receiver(post_save, sender=SessionAnswer)
    def clear_session_cache_by_answer(sender, instance, **kwargs):
        cache.delete(f"session:detail:{instance.session_id}")
    
    其余关联模型的信号处理器可参考上述逻辑按需补充。

2. 缓存版本号自动失效

如果关联层级较深、绑定信号过于繁琐,可以采用版本号机制实现无感失效:

  • 为每个Session设置独立的缓存版本号,可以存在模型字段中,也可以单独存在缓存里,键规则如session:version:{session_id}
  • 每次Session或其关联的任意资源变更时,将对应Session的版本号加1
  • 生成接口缓存键时携带版本号,如session:detail:{sid}:v{version},版本号变更后旧缓存键自然不会被命中,无需主动清理旧缓存,等待过期即可。

3. 短有效期兜底

如果接口数据对实时性要求不高,可以将缓存有效期设置为5-15分钟作为兜底方案,降低数据不一致的时间窗口。

若你同时缓存了Session的列表接口,需要额外处理列表缓存的失效:可以给所有列表缓存设置统一前缀,变更时批量删除所有带该前缀的缓存键,也可以为列表接口单独设置全局版本号控制。

内容的提问来源于stack exchange,提问作者Vaibhav Rathore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:24:05