试图了解在 django 低级 cache.set() 期间发生了什么特别是有关查询集的哪些部分存储在 memcached 中的详细信息。
首先,我是否正确解释了 django 文档?
- 查询集(python 对象)拥有/维护自己的缓存
- 对数据库的访问是惰性的;即使 queryset.count 是 1000,如果我为 1 条记录执行 object.get,那么对于 1 条记录,dbase 只会被访问一次。
- 当通过 apache prefork MPM 访问 django 视图时,每次特定守护程序实例 X 最终调用包含诸如“tournres_qset = TournamentResult.objects.all()”之类的特定视图时,这将导致每次都产生一个新的tournres_qset 对象被创建。也就是说,任何可能已经被前一次(tcp/ip)访问的 tournres_qset python 对象内部缓存的东西,根本不会被新请求的 tournres_qset 使用。
现在是关于在视图中将内容保存到 memcached 的问题。假设我在视图顶部添加了这样的内容:
tournres_qset = cache.get('tournres', None)
if tournres_qset is None:
tournres_qset = TournamentResult.objects.all()
cache.set('tournres', tournres_qset, timeout)
# now start accessing tournres_qset
# ...
在 cache.set() 期间存储了什么?
整个查询集(python 对象)是否被序列化并保存?
由于尚未使用查询集来获取任何记录,这是否只是浪费时间,因为实际上没有特定记录的内容保存在内存缓存中?(任何未来的请求都会从 memcache 中获取 queryset 对象,该对象将始终以空的本地查询集缓存重新开始;将始终访问 dbase。)
如果上述情况属实,那么我是否应该总是在视图末尾重新保存查询集,在整个视图中使用它来访问一些记录之后,这将导致查询集的本地缓存得到更新,并且应该总是被重新保存到memcached?但是,这总是会导致再次序列化查询集对象。这么多可以加快速度。
或者,cache.set() 是否强制 queryset 对象迭代并从 dbase 访问所有记录,这些记录也会保存在 memcache 中?即使视图只访问查询集的子集,一切都会被保存?
我看到了各个方向的陷阱,这让我认为我
误解了很多事情。
希望这是有道理的,并感谢对一些“标准”指南的澄清或指示。谢谢。