簡體   English   中英

在 ListView 中更新保存 vs 計數對象的模型 - 什么是更好的性能?

[英]Updating model on save vs count objects in the ListView - what's better performance-wise?

我正在創建一個論壇腳本。 目前我正在嘗試優化事物並從更有經驗的開發人員那里尋找答案。

例如 - 假設我們正在處理類別的 ListView,它應該列出同一論壇類別中的所有線程。 對於類別中的每個線程,我們列出了以下字段:

  • 線程名稱

  • 主題作者

  • 帖子數

  • 觀看次數

  • 最后發表的詳細信息(作者、日期)

計算帖子數量的最佳性能方法是什么? 目前我正在考慮 3 種解決方案。

  1. 在查詢集上使用annotate()
  2. 將 IntegerField posts_number添加到Thread模型。 Post模型中增加save()的值並減少delete()
  3. 使用 memcache 緩存只讀 SQL 查詢並在Post模型中的每個save()上強制刷新緩存。

我知道這不是低流量論壇的問題,但我很想知道什么是最好的方法

我通常處理線程模型本身的帖子計數,而不是作為一個額外的模型. model.field而是作為一種方法或屬性,並將評估值緩存一次,並且當該線程上有新帖子時才使該線程的緩存無效。 這邊走

  • 當另一個線程上有新帖子時,並非所有緩存的計數都無效
  • 我可以從整個應用程序訪問帖子計數而無需數據庫命中
  • 您不需要每次都查詢帖子數,僅當帖子數發生變化(刪除和插入)時

而對於您的解決方案

  1. 注釋比在 for 循環中計算每個線程的計數更快,但是即使沒有新的 Post..

  2. 線程模型上的整數字段容易出現數據不一致,尤其是從長遠來看(例如,如果有 2 個用戶正在訪問它,或者在管理員中工作時創建了一個新帖子,則來自管理員。因此,您最終可能會編寫線程安全帶鎖的代碼或最終編寫額外的樣板以使其成為只讀,例如照顧用戶使用“全部”序列化程序等在其上寫入)

  3. 對於您的memcache解決方案,我認為最好不要將它們綁定在一起(線程A上的新帖子不會讓您重新計算所有線程的計數)

此外,在 model.save 中處理更新緩存不是一個好習慣,因為它一直被調用(例如編輯帖子),最好在您實際創建或刪除帖子的地方無效而不更新緩存(例如在管理員中並編寫一個自定義表單,或在您的視圖或serializer.perform_create或信號中,但要注意軟刪除等。)

更新:

由於您的問題是關於性能的,因此您應該查看django ORM optimization doc最重要的是select_related and prefetch_related

此外,如果您在從數據庫中獲取它們后不需要 python 對象並且只需要它們的值, 請不要將它們轉換為 python 對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM