gpt4 book ai didi

python - 在 ListView 中更新保存模型与计数对象 - 性能方面哪个更好?

转载 作者:行者123 更新时间:2023-12-01 07:35:58 24 4
gpt4 key购买 nike

我正在创建一个论坛脚本。目前我正在尝试优化事情并寻找更有经验的开发人员的答案。

例如 - 假设我们正在处理类别的 ListView,它应该列出同一论坛类别中的所有线程。对于类别中的每个线程,我们都会列出以下字段:

  • 话题名称

  • 话题作者

  • 帖子数量

  • 观看次数

  • 最后一篇文章的详细信息(作者、日期)

计算帖子数量的最佳性能方法是什么?目前我正在考虑 3 个解决方案。

  1. 在查询集上使用 annotate()
  2. 将 IntegerField posts_number 添加到 Thread 模型。在 Post 模型中增加 save() 的值,并在 delete()
  3. 上减少值
  4. 使用 memcache 缓存只读 SQL 查询,并在 Post 模型中的每个 save() 上强制刷新缓存。

我知道这不是低流量论坛的问题,但我很想知道最好的方法是什么

最佳答案

我通常处理线程模型本身的帖子计数,而不是作为额外的 model.field 而是作为一种方法或属性,并缓存一次评估值并使该缓存无效仅当该线程上有新帖子时。这边走

  • 当另一个线程上有新帖子时,并非所有缓存计数都会失效
  • 我可以从整个应用程序访问帖子计数,而无需访问数据库
  • 您无需每次查询帖子计数,只需在帖子计数发生更改(删除和插入)时查询

以及您的解决方案

  1. 注释比在 for 循环中计算每个线程的计数要快,但即使没有新的帖子,您也必须每次都对其进行计数..

  2. 线程模型上的整数字段很容易出现数据不一致,尤其是从长远来看(例如,如果有 2 个用户正在访问它,或者在您在管理员中工作时创建了一个新帖子,则来自管理员。所以您可能最终会编写带锁的线程安全代码,或者最终编写额外的样板以使其只读,例如使用“all”序列化器等处理用户在其上写入的内容。)

  3. 对于您的 memcache 解决方案,我认为最好是它们没有绑定(bind)在一起(线程 A 上的新帖子不会让您重新计算所有的计数)线程)

另外,在 model.save 中处理更新缓存并不是一个好习惯,因为它一直被调用(例如编辑帖子),最好在实际创建或删除的地方使缓存无效而不更新帖子(例如,在管理员中并编写自定义表单,或者在您的 View 或 serializer.perform_create 中,或者在信号中,但要注意软删除等。)

更新:

由于您的问题是关于性能的,您应该看一下 django ORM optimization doc最重要的是select_lated 和 prefetch_lated

此外,如果您从数据库获取 python 对象后不需要它们,而只需要它们的值 don't convert them to python objects

关于python - 在 ListView 中更新保存模型与计数对象 - 性能方面哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56992078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com