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

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

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

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

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

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

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

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

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

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

全員に返信(2)
阿神

redis pub/sub subscription/push、これまたはより高度なメッセージ キュー ミドルウェアの使用を検討しましたか?

基本的なロジックはこれで、メッセージはデータベースまたは他の nosql にキャッシュされる必要があります。
メッセージ センターを分割し、redis pub/sub システムまたはリストを使用して、メッセージを送信する必要がある他のユーザーは、redis 経由でメッセージを送信するようにメッセージ センターに通知します。
メッセージ センターは、ユーザーがオンラインかどうかを確認し、オンライン (WebSocket などを介して、SSE も利用可能) でユーザーにメッセージを直接送信し、既読としてマークします
ユーザーがオンラインであれば、すべて未読メッセージはプルされます
メッセージは、オンラインかどうかに関係なく、保存する必要があります。 。 。
redis の値は文字列であるため、ユーザーを区別するには、値が json 文字列であることだけが必要です。

リーリー
いいねを押す +0
phpcn_u1582

Key はメッセージタイプを保持します
Value はシリアル化後の辞書などのビジネスデータを保持します。その後、それを取り出して逆シリアル化して直接使用できます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート