小编obl*_*n02的帖子

django querysets + memcached:最佳实践

试图理解在django低级别cache.set()期间发生的事情.特别是,有关查询集的哪个部分存储在memcached中的详细信息.

首先,我是否正确地解释了django文档?

  • queryset(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
# ...
Run Code Online (Sandbox Code Playgroud)

在cache.set()期间存储了什么?

  • 整个查询集(python对象)是否被序列化并保存?

  • 由于尚未使用查询集来获取任何记录,这只是浪费时间,因为在memcache中实际上没有保存特定记录的内容?(任何将来的请求都将从memcache获取queryset对象,它始终是新的,具有空的本地queryset缓存;将始终访问dbase.)

  • 如果以上情况属实,那么我是否应该始终在查看结束时重新保存查询集,之后在整个vierw中使用它来访问某些记录,这将导致查询集的本地缓存得到更新,哪些应该更新总是被重新保存到memcached?但是,这总是会导致再次序列化queryset对象.加快速度如此之快.

  • 或者,cache.set()是否强制查询集对象迭代并从dbase访问所有记录,这些记录也将保存在memcache中?即使视图只访问查询集的子集,一切都会被保存?

我看到各方面的陷阱,这让我觉得我
误解了很多东西.

希望这是有道理的,并欣赏澄清或指向一些"标准"指南.谢谢.

python django django-cache

16
推荐指数
1
解决办法
5156
查看次数

标签 统计

django ×1

django-cache ×1

python ×1