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(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(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(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(无指定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
相关产品推荐
相关产品推荐

