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

Django中cache.set()默认使用version=1而非version=None吗?

Django Cache 默认版本的疑问解答

结论

Django缓存的set()方法默认并非直接使用version=None,而是会回退到缓存后端配置的默认版本号1。文档里的version=None表示"使用配置中的默认版本",而非实际存储时用None作为版本标识。

原理说明

Django缓存框架的版本控制逻辑中:

  • 当调用cache.set()或cache.get()时传入version=None,会读取缓存配置里的VERSION参数值(默认是1)。
  • 不同版本的同键名缓存会被视为独立的缓存条目,互不干扰。

结合测试案例验证

你的测试结果完全符合这个逻辑:

  1. 测试1(version=0):
    不指定version设置的John用的是默认版本1,version=0设置的David是独立条目,所以get("name")拿版本1的John,get("name", version=0)拿版本0的David。

    from django.core.cache import cache
    
    cache.set("name", "John")
    cache.set("name", "David", version=0)
    print(cache.get("name")) # John
    print(cache.get("name", version=0)) # David
    
  2. 测试2(version=2):
    同理,version=2的David和默认版本1的John是独立条目,所以分别获取到对应值。

    from django.core.cache import cache
    
    cache.set("name", "John")
    cache.set("name", "David", version=2)
    print(cache.get("name")) # John
    print(cache.get("name", version=2)) # David
    
  3. 测试3(version=1):
    不指定version设置的John用默认版本1,之后用version=1设置David会覆盖这个条目,所以两次get都拿到David。

    from django.core.cache import cache
    
    cache.set("name", "John")
    cache.set("name", "David", version=1)
    print(cache.get("name")) # David
    print(cache.get("name", version=1)) # David
    
  4. 测试4(无指定version):
    两次set都用默认版本1,第二次的David覆盖了第一次的John,所以两次get都拿到David。

    from django.core.cache import cache
    
    cache.set("name", "John")
    cache.set("name", "David")
    print(cache.get("name")) # David
    print(cache.get("name")) # David
    

补充说明

如果你需要修改默认版本,可以在settings.py的缓存配置中设置VERSION参数,比如:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'VERSION': 2, # 修改默认版本为2
    }
}

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:04:51