Maison  >  Article  >  développement back-end  >  Utilisez Redis pour envoyer des messages aux utilisateurs une fois par jour via FCM en fonction de leurs préférences temporelles changeantes afin d'éviter la duplication

Utilisez Redis pour envoyer des messages aux utilisateurs une fois par jour via FCM en fonction de leurs préférences temporelles changeantes afin d'éviter la duplication

王林
王林avant
2024-02-06 09:00:09686parcourir

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

Contenu des questions

Contexte

J'ai de nombreux messages et le nombre de votes positifs et négatifs de chaque message est stocké dans ma base de données Postgres. J'utilise un serveur Gin Golang, une application mobile Flutter et j'envoie des notifications aux utilisateurs à l'aide de FCM (Firebase Cloud Messaging).

Problèmes architecturaux

Tout d’abord, ce problème est facile à résoudre. Je ne sais tout simplement pas comment le résoudre efficacement.

Je souhaite envoyer les messages les plus votés à chaque utilisateur environ une fois par jour. Cependant, je souhaite envoyer des notifications aux utilisateurs en fonction de l'heure à laquelle ils sont le plus actifs dans l'application (pas toutes en même temps, c'est-à-dire pas seulement à minuit tous les jours).

Alors, disons que j'ai un champ appelé active_times 的表中跟踪每个用户的一个条目,该条目有一个我根据他们与移动应用程序(如 Postgres 中的 time) qui est mis à jour lors de l'interaction. Je mets constamment à jour en fonction de l'activité des utilisateurs.

Mon instinct me dit que je devrais exécuter une tâche cron sur mon serveur toutes les ~2 heures pour rechercher ceux qui ont time 字段的所有用户。然后,我将置顶帖子通知发送给这些用户。然后,我在 Redis 缓存中保存一个映射 user_ids 到 time_notification_recieveds 的哈希集,并将自动过期设置为大约 12 小时。对于每个后续查询,我首先检查Redis中的if user_id,不要发送给该用户,否则,发送并将id添加到Redis dans cette fenêtre d'environ 2 heures.

Cela me permettra d'avoir une fenêtre si l'utilisateur se connecte soudainement ou interagit directement sur l'application après que la notification lui ait été envoyée (en déplaçant son activité vers time),他们最多会在 12 小时内收到通知稍后,但通常由于其活动窗口不会发生太大变化,因此大约每 24 小时(每天)发送一次。例如,这与他们的 time la fenêtre est à 14h à la place, puis après lui avoir envoyé la notification, c'était mis à jour à 16h et ils ont été à nouveau attaqués dans les 2 heures

.

Remarques

Est-ce une méthode efficace ? J'ai initialement envisagé d'utiliser une base de données Postgres pour stocker tous ces identifiants, mais j'ai pensé que cela pourrait rapidement submerger la base de données.

De plus, est-ce à cela que sert Redis ? Existe-t-il une approche complètement différente que je peux adopter pour ce faire ?

Merci !


Bonne réponse


Jusqu'à ce que vous ayez des millions d'utilisateurs, tout ce que vous faites toutes les quelques heures sera très efficace.

J'aurais une colonne séparée (par exemple) dans le tableau des utilisateurs avec "prochaine heure de notification" pour planifier les notifications. Je suppose que vous ne voulez pas être dans une situation où un utilisateur utilise le système et reçoit immédiatement une notification, n'est-ce pas ?

Pour déterminer quand envoyer des notifications, vous pouvez utiliser un tableau avec un mini histogramme d'activité quelque chose comme ça

 ;
  • ID utilisateur
  • Heure de la journée
  • Compteur

Le compteur est ensuite incrémenté à chaque fois que l'utilisateur effectue une "activité". Ensuite, lors du calcul de la « Prochaine heure d'envoi d'une notification », vous pouvez consulter ce tableau pour trouver le meilleur moment pour cet utilisateur particulier. Au fil du temps, vous pouvez améliorer l'algorithme pour qu'il devienne plus complexe que le simple comptage d'activités. (Peut-être souhaitez-vous être averti une heure avant que l'utilisateur ne soit généralement actif ? Ou peut-être à un moment où il utilise parfois l'application mais n'y est pas habitué, etc.)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer