试图理解django低级缓存设置(cache.set())的过程,特别是关于哪部分查询集(queryset)存储在memcached中的详细信息。
首先,我是否正确理解了django文档?
- 查询集(Python对象)具有/维护自己的缓存
- 访问数据库是惰性的;即使查询集.count为1000,如果我只为1条记录做一个object.get,则数据库仅被访问一次,即用于该1条记录。
- 当通过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中 (任何未来的请求都将从memcache中获取查询集对象,该对象始终从空的本地查询集缓存开始;访问数据库将始终发生。)
如果以上内容属实,那么在视图结束时,我应该重新保存查询集吗?这样它就可以在整个视图中被使用以访问一些记录,这将导致查询集的本地缓存得到更新,并且应该始终重新保存到memcached中?但是这将再次导致序列化查询集对象。所以加速事情变得更糟。
还是说cache.set()强制查询集对象迭代并从数据库中访问所有记录,这也会保存在memcache中?所有内容都将被保存,即使视图仅访问一部分查询集?
我看到了各种陷阱,这让我认为我可能误解了很多事情。
希望这有意义,感谢澄清或指向一些“标准”指南。 谢谢。
.filter()
重新向数据库查询,那么可以使用Python的过滤器而不是Django ORM的过滤器。因此,可以像这样做:new_queryset = filter(lambda x: x.field == True, cached_queryset)
。这样就不会再次查询数据库。 - awidgery