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

当视图变更时,如何通知多个独立缓存的Django只读实例?

多实例Django缓存失效处理方案

Django框架内的标准实现方式

  • 基于共享缓存的信号触发:Django本身没有跨实例的原生缓存失效通知,但结合分布式共享缓存后端(如Redis、Memcached)就能实现核心需求:
    • 当可写实例处理POST请求修改数据时,用cache.delete()删除共享缓存中对应的视图缓存键;或者利用post_save模型信号,在数据更新时自动触发缓存失效。比如修改用户邮箱后,直接删除该用户的个人资料缓存:
      from django.db.models.signals import post_save
      from django.dispatch import receiver
      from django.core.cache import cache
      from myapp.models import User
      
      @receiver(post_save, sender=User)
      def invalidate_user_cache(sender, instance, **kwargs):
          cache.delete(f"user_profile_{instance.id}")
      
    • 注意:如果只读实例用的是本地内存缓存(LocMemCache),这种方式不生效,必须让所有实例共用同一个分布式缓存后端,这样失效操作能直接同步到所有实例的缓存读取源。
  • 精细化模板缓存:用{% cache %}标签时,给缓存键加上动态参数(比如用户ID),这样失效时能精准删除单条缓存,避免大面积缓存清空。

需要自行开发的补充场景

如果一定要保留本地缓存(追求极致读性能),就得自己做跨实例的失效通知:

  • 借助消息队列(Redis Pub/Sub、RabbitMQ)实现:可写实例完成POST操作后,往消息频道发送缓存键失效指令;所有只读实例后台订阅该频道,收到指令后删除本地对应缓存。
  • 简单示例:
    1. 可写实例发消息:
    import redis
    
    r = redis.Redis(host='你的Redis地址', port=6379, db=0)
    r.publish('cache_invalidate', 'user_profile_123')
    
    1. 只读实例后台监听:
    import redis
    import threading
    from django.core.cache import cache
    
    def cache_invalidation_listener():
        r = redis.Redis(host='你的Redis地址', port=6379, db=0)
        pubsub = r.pubsub()
        pubsub.subscribe('cache_invalidate')
        for msg in pubsub.listen():
            if msg['type'] == 'message':
                cache_key = msg['data'].decode('utf-8')
                cache.delete(cache_key)
    
    # Django启动时启动守护线程
    threading.Thread(target=cache_invalidation_listener, daemon=True).start()
    

更优替代方案

  • CDN前端缓存:把高频GET请求的页面/静态资源放到CDN,POST修改数据后调用CDN的刷新API清除对应资源缓存。这种方式能极大减轻后端压力,且缓存失效是全局生效的。
  • 数据库只读副本:给主库配置只读副本,只读实例直接访问副本,可写实例写主库,依赖数据库主从同步保证数据一致。适合对实时一致性要求不高的场景,能减少缓存依赖。
  • 缓存自动过期+兜底刷新:给缓存设置合理的过期时间,结合共享缓存,即使偶尔出现过期数据,后续请求会自动刷新缓存,同时避免大量请求直接击穿到数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:33:35