flask - web消息通知中,如何用轮询redis来代替轮询数据库?
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-04-27 09:03:46
0
2
1376

我想在自己的flask应用中实现简单的消息通知功能,例如管理员向全体用户发公告,或者想某个用户发出提醒等功能。

可是在实现过程中遇到了一个难题,情况具体描述如下:

我使用sse机制来使服务器向客户端发送消息,可是这里出现了问题,就是发送消息的模块并不知道什么时候应该发送消息,例如当用户A评论了用户B的博客时,这时就需要通知用户B,我们此时需要通知发送模块:“你该向B发送消息了”,如何通知发送模块呢?

我想到的就是轮询数据库,但是感觉这样太考验服务器的抗压了,百度到说:每当对应的数据表更新,就产生一个消息到Redis中,然后轮询Redis。

这样听起来挺好,可是在实现中遇到了很多问题:

例如:(1)redis是key-value存储,当管理员既要给A发消息,又要给B,C等发消息,此时用key该如何区分?

    (2)假设现在要给用户B发消息,那么会产生对应的消息存储在redis中,如果此刻
    用户B并未登录呢,难道用户B一周不登录,该消息就会在redis中一周吗?
    【我对redis不太了解,知道是在缓存中存储,所以感觉不可能在缓存中能存储一周】

思考两三天了,望各位前辈能够指点一二

曾经蜡笔没有小新
曾经蜡笔没有小新

répondre à tous(2)
阿神

redis pub/sub souscription/push, avez-vous envisagé d'utiliser ce middleware de file d'attente de messages ou un middleware plus avancé ?

La logique de base est la suivante, le message doit être mis en cache dans la base de données ou autre nosql.
Divisez le centre de messagerie et utilisez le système ou la liste redis pub/sub. Les autres personnes qui ont besoin d'envoyer des messages informeront le centre de messagerie d'envoyer des messages via Redis.
Le centre de messagerie vérifie si l'utilisateur est en ligne, lui envoie des messages directement lorsqu'il est en ligne (via websocket, etc., SSE peut également être utilisé) et le marque comme lu
Si l'utilisateur est en ligne, il extraira tous les messages non lus
Peu importe qu'il soit en ligne. Tous les messages en ligne doivent être stockés dans la base de données. . .
Étant donné que la valeur de redis est une chaîne, pour distinguer les utilisateurs, il vous suffit que la valeur soit une chaîne json.

{
    "target":["a","b"],
    "message":"我是要发送给用户a和b的消息"
}
phpcn_u1582

la clé contient le type de message
la valeur contient des données commerciales, telles que le dict après la sérialisation. Vous pouvez mettre ce que vous voulez et autant que vous le souhaitez. Ensuite, vous pouvez le supprimer, le désérialiser et l'utiliser directement. 🎜>

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal