Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie Redis, um einmal täglich Nachrichten über FCM an Benutzer zu senden, basierend auf ihren sich ändernden Zeitpräferenzen, um Duplikate zu vermeiden

Verwenden Sie Redis, um einmal täglich Nachrichten über FCM an Benutzer zu senden, basierend auf ihren sich ändernden Zeitpräferenzen, um Duplikate zu vermeiden

王林
王林nach vorne
2024-02-06 09:00:09669Durchsuche

使用 Redis,根据用户不断变化的时间偏好,通过 FCM 每天向用户发送一次消息,避免重复

Frageninhalt

Kontext

Ich habe viele Beiträge und die Anzahl der Upvotes und Downvotes für jeden Beitrag wird in meiner Postgres-Datenbank gespeichert. Ich betreibe einen Gin Golang-Server, eine mobile Flutter-App und sende Benachrichtigungen an Benutzer über FCM (Firebase Cloud Messaging).

Architektonische Probleme

Zuallererst ist dieses Problem leicht zu lösen. Ich weiß einfach nicht, wie ich es effektiv lösen soll. Ich möchte jedem Benutzer ungefähr einmal am Tag die am besten bewerteten Beiträge senden. Ich möchte jedoch Benachrichtigungen an Benutzer senden, die auf der Zeit basieren, zu der sie in der App am aktivsten sind (nicht alle auf einmal, d. h. nicht nur jeden Tag um 12 Uhr).

Angenommen, ich habe ein Feld mit dem Namen

, das bei Interaktion aktualisiert wird. Ich aktualisiere ständig basierend auf der Benutzeraktivität.

active_times 的表中跟踪每个用户的一个条目,该条目有一个我根据他们与移动应用程序(如 Postgres 中的 timeMein Bauch sagt mir, dass ich alle ~2 Stunden einen Cron-Job auf meinem Server ausführen sollte, der innerhalb dieses ~2-Stunden-Fensters nach denjenigen fragt, die

haben.

time 字段的所有用户。然后,我将置顶帖子通知发送给这些用户。然后,我在 Redis 缓存中保存一个映射 user_ids 到 time_notification_recieveds 的哈希集,并将自动过期设置为大约 12 小时。对于每个后续查询,我首先检查Redis中的if user_id,不要发送给该用户,否则,发送并将id添加到Redis Dies ermöglicht es mir, ein Fenster zu haben, wenn sich der Benutzer plötzlich anmeldet oder direkt in der App interagiert, nachdem die Benachrichtigung an ihn gesendet wurde (wobei seine Aktivität verschoben wird auf

das Fenster ist stattdessen 14 Uhr, und nachdem ich ihm die Benachrichtigung gesendet habe, war es so um 16 Uhr aktualisiert und sie wurden innerhalb von 2 Stunden erneut angegriffen

. time),他们最多会在 12 小时内收到通知稍后,但通常由于其活动窗口不会发生太大变化,因此大约每 24 小时(每天)发送一次。例如,这与他们的 timeBemerkungen

Ist das eine wirksame Methode? Ich habe zunächst darüber nachgedacht, eine Postgres-Datenbank zum Speichern all dieser IDs zu verwenden, dachte aber, dass dies die Datenbank schnell überfordern könnte.

Ist Redis auch dafür gedacht? Gibt es einen völlig anderen Ansatz, den ich dafür wählen kann?

Danke!

Richtige Antwort

Bis Sie Millionen von Benutzern haben, wird alles, was Sie alle paar Stunden tun, sehr effizient sein.

Ich hätte (zum Beispiel) eine separate Spalte in der Benutzertabelle mit „Nächste Benachrichtigungszeit“ zum Planen von Benachrichtigungen. Ich schätze, Sie möchten nicht in eine Situation geraten, in der ein Benutzer das System verwendet und dann sofort eine Benachrichtigung erhält, oder?

Um zu bestimmen, wann Benachrichtigungen gesendet werden sollen, können Sie eine Tabelle mit einem Mini-Aktivitätshistogramm verwenden

Benutzer-ID
  • Tageszeit
  • Zähler
  • Der Zähler wird dann jedes Mal erhöht, wenn der Benutzer eine „Aktivität“ ausführt. Wenn Sie dann „Nächster Zeitpunkt zum Senden einer Benachrichtigung“ berechnen, können Sie anhand dieser Tabelle den besten Zeitpunkt für diesen bestimmten Benutzer ermitteln. Mit der Zeit können Sie den Algorithmus verbessern, sodass er komplexer wird als nur die Aktivitätszählung. (Vielleicht möchten Sie eine Stunde bevor der Benutzer normalerweise aktiv ist, benachrichtigt werden? Oder vielleicht zu einem Zeitpunkt, zu dem er die App manchmal nutzt, aber nicht daran gewöhnt ist usw.)

Das obige ist der detaillierte Inhalt vonVerwenden Sie Redis, um einmal täglich Nachrichten über FCM an Benutzer zu senden, basierend auf ihren sich ändernden Zeitpräferenzen, um Duplikate zu vermeiden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen