cari

Rumah  >  Soal Jawab  >  teks badan

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不太了解,知道是在缓存中存储,所以感觉不可能在缓存中能存储一周】

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

曾经蜡笔没有小新曾经蜡笔没有小新2792 hari yang lalu1377

membalas semua(2)saya akan balas

  • 阿神

    阿神2017-04-27 09:05:46

    redis pub/sub langganan/push, adakah anda mempertimbangkan untuk menggunakan perisian tengah baris gilir mesej ini atau lebih lanjut?

    Logik asasnya ialah ini, mesej perlu dicache dalam pangkalan data atau nosql lain.
    Pisah pusat mesej dan gunakan sistem pub/sub redis atau senarai Orang lain yang perlu menghantar mesej akan memberitahu pusat mesej untuk menghantar mesej melalui redis.
    Pusat mesej menyemak sama ada pengguna berada dalam talian, menghantar mesej terus kepada pengguna apabila dalam talian (melalui soket web, dsb., SSE juga boleh digunakan), dan menandakannya sebagai dibaca
    Jika pengguna dalam talian, ia akan menarik semua mesej yang belum dibaca
    Tidak kira sama ada dia dalam talian Semua mesej dalam talian mesti disimpan dalam pangkalan data. . .
    Memandangkan nilai redis ialah rentetan, untuk membezakan pengguna, anda hanya memerlukan nilai untuk menjadi rentetan json.

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

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-04-27 09:05:46

    Key memegang jenis mesej
    Nilai menyimpan data perniagaan, seperti dict selepas bersiri Anda boleh meletakkan apa sahaja yang anda mahu dan seberapa banyak yang anda mahu, kemudian anda boleh mengeluarkannya dan menyahserikannya dan menggunakannya secara terus

    balas
    0
  • Batalbalas