簡體   English   中英

PHP 應用程序中的未讀消息計數

[英]Unread message count in a PHP app

我目前正在開發一個簡單的 PHP 應用程序,用戶可以在其中相互發送消息。 消息存儲在 SQL 數據庫中。 我想在每一頁的菜單中計算未讀消息的數量,以便用戶可以快速查看他們是否有新消息,而無需定期檢查收件箱。

雖然這可能是一個容易解決的問題,但我不知道最好的方法是什么,性能方面:

  1. 在每次頁面加載時執行一個普通的 SQL COUNT() 未讀消息(立即通知更改,但它可能會嚴重影響性能?)
  2. 做同樣的事情,但將結果緩存 X 分鍾(我們會造成煩人的延遲)
  3. 與 2. 相同,但僅在我們讀取消息或向我們發送消息時更新(可能會占用大量 RAM / 給磁盤帶來壓力,因為我們為每個用戶創建一個持久條目/文件:我們無法存儲它在 $_SESSION 因為我們需要在另一個用戶向我們發送消息時更新它)

我所有的解決方案都是基於服務器的,因為我對 JS 不是很熟悉。 但是如果使用 JavaScript 存在更好的解決方案,那沒關系。

謝謝您的幫助 !

我建議第4個:

將新消息發送給用戶后,您將更新memcache中的計數器。 您在客戶端創建簡單的 ajax 應用程序,每 X 秒發送一次請求。 在服務器端,您只需檢查是否有未讀消息。 在頁面刷新時,您不需要查詢數據庫,因為您從memcache中獲取計數非常快。

如果我在 DB 中遇到瓶頸,這就是我所做的(在 90% 的情況下,DB 是任何數據庫驅動應用程序中最常用的部分)。

這就是我們通常在高負載的 web 站點上所做的事情:我們試圖避免任何 COUNTER 查詢。 如果不是,我們將數據庫非規范化以將計數器存儲在適當的表中作為另一列,例如,如果您不能使用memcache ,則將未讀消息計數器存儲為Users表的列。

對於選項三,我會選擇 go,但我會添加memcached作為解決方案 4。

在每次頁面加載時執行一個普通的 SQL COUNT() 未讀消息(立即通知更改,但它可能會嚴重影響性能?)

只要你有一個像樣的表結構, COUNT() 是一個非常快的命令。 我不會緩存這個特定的命令。 相反,我會計算其他查詢,以確保您只在向他們顯示列表時返回您需要的數據。 例如,如果您只需要摘錄,我會確保執行以下操作:

SELECT id, author, msgdate, substring(body, 0, 50) from table where recipient = ?

代替

SELECT * from table where recipient = ?;

恕我直言。 最好讓客戶端 ping 服務器並發送一個 json 與未讀消息的數量。 mysql 的計數應該很快,所以我認為沒有理由不使用它。 只需過濾聊天 session 上的結果。

對於數據庫部分。 最好的方法是在你的 db 表中存儲一個 new_message 並將其默認為 1,並在消息加載后將其設置為 0。

暫無
暫無

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

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