flask - web消息通知中,如何用轮询redis来代替轮询数据库?

查看:207
本文介绍了flask - web消息通知中,如何用轮询redis来代替轮询数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

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

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

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

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

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

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

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

解决方案

redis pub/sub 订阅/推送 ,是否考虑过使用这样或者更高级的消息队列中间件呢。

基本逻辑是这样的,消息是需要缓存在数据库或者其他nosql的。
拆分出消息中心,使用redis的pub/sub体系或者list,其他需要发送消息的通过redis通知消息中心发送消息。
消息中心检查用户是否在线,在线直接发送消息给用户(通过websocket之类的,sse也可以),并标记已读
用户在线是拉取全部未读消息
无论在不在线消息都要入库。。。
由于redis的value是字符串,要区分用户,你只要、value是个json字符串就好了。

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

这篇关于flask - web消息通知中,如何用轮询redis来代替轮询数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆