我有很多帖子,每個帖子的讚成票和反對票計數都儲存在我的 Postgres 資料庫中。我正在運行 Gin Golang 伺服器、Flutter 行動應用,並使用 FCM(Firebase 雲端訊息傳遞)向用戶發送通知。
首先,這個問題很容易解決。我只是不知道如何有效解決它。
我想大約每天向每個用戶發送一次得票最高的貼文。但是,我想根據用戶在應用程式中最活躍的時間向他們發送通知(不是一次全部發送,即不僅僅是每天上午 12 點)。
所以,假設我在一個名為active_times
的表中追蹤每個使用者的一個條目,該條目有一個我根據他們與行動應用程式(如Postgres 中的time
)互動時更新的欄位。我根據用戶活動不斷更新。
我的直覺告訴我,我應該每隔約 2 小時在我的伺服器中執行一個 cron 作業,該作業會查詢在該約 2 小時視窗內擁有 time
欄位的所有使用者。然後,我將置頂貼文通知發送給這些用戶。然後,我在 Redis 快取中保存一個映射 user_id
s 到 time_notification_recieved
s 的雜湊集,並將自動過期設定為大約 12 小時。對於每個後續查詢,我首先檢查Redis中的if user_id,不要發送給該用戶,否則,發送並將id添加到Redis
。
這將允許我有一個窗口,如果用戶在通知發送給他們後突然登入或直接在應用程式上進行互動(將他們的活動轉移到time
),他們最多會在12小時內收到通知稍後,但通常由於其活動視窗不會發生太大變化,因此大約每24 小時(每天)發送一次。例如,這與他們的 time
視窗是下午 2 點相反,然後在我向他們發送通知後,它更新到下午 4 點,他們在 2 小時內再次受到攻擊。
這是一種有效的方法嗎?我最初考慮使用 Postgres 資料庫來儲存所有這些 ID,但我認為這可能很快就會壓垮資料庫。
此外,Redis 就是用來做這種事的嗎?我可以採取完全不同的方法來做到這一點嗎?
謝謝!
在您擁有數百萬用戶之前,您每隔幾個小時執行的任何操作都會非常有效率。
我會在用戶表中有一個單獨的列(例如),其中包含“下一個通知時間”,用於安排通知。我想您不希望出現這樣的情況:使用者正在使用系統,然後立即收到通知,對嗎?
為了確定何時發送通知,您可以使用一個帶有迷你活動直方圖的表格;類似的東西
然後每當使用者進行「活動」時就會增加計數器。然後,在計算「下次發送通知的時間」時,您可以查看此表以找到該特定使用者的最佳時間。隨著時間的推移,您可以改進演算法,使其變得更加複雜,而不僅僅是活動計數。 (也許您希望在用戶通常活躍之前一小時收到通知?或者可能是他們有時使用該應用程式但不習慣使用的時間,等等)。
以上是使用 Redis,根據用戶不斷變化的時間偏好,透過 FCM 每天向用戶發送一次訊息,避免重複的詳細內容。更多資訊請關注PHP中文網其他相關文章!