我想了几天,我想知道在大量数据读写下怎么取出完整的用户未读消息

助哥的后花园 发布于 2018/01/30 23:36
阅读 1K+
收藏 0

我在用netty做一个IM的东西,我对于大量数据的聊天消息我选择是用MQ做异步写入数据库,但是有个问题,我想实现未读已读功能,于是直接在消息表中加了个状态字段,表示未读已读,如果对方用户在线,我就直接发给他,然后客户端本地做未读已读状态和消息记录,显然我服务端也肯定也要做的,一旦用户下机了重新登录或者换了个手机其他的那我也可以知道有哪些是未读的消息,也就是说我想要做到实时的保存每一条聊天记录,当我重新登录的时候我可以查出来有哪些消息是未读的。用MQ肯定无法实时的。

对于判断是否是已读的还是未读的,我是通过客户端点击了哪个用户的面板,然后上传数据到服务端,我保存他的状态一个MAP<FROM,TO>chatToWhoMap 来表示正在和谁聊天。

1.然后就是怎么保证写入数据库的聊天记录的未读已读状态是正确的,因为mq异步如果数据大了,队列大起来了,肯定有延迟啊,然后我就在MQ的消费端,写入之前,对方有可能点击了朋友的面板,这个时候与这个朋友的的数据应该都是已读的了,开始我是可以在写入之前在判断一次chatToWhoMap 是不是在和这个朋友在对话了,然后在修改状态写入,但是也有可能是对方打开了一下,然后又关闭了,又开了其他的用户的面板了。好我可以再做个记录,记录这个用户点击朋友的面板记录,包括点击时间和关闭时间,每个朋友对应一条记录,如果当前正在和朋友对话那么就是已读的,如果不是和这个用户对话,再判断关闭时间>这条消息的发送时间 那就是已读第的,关闭时间<发送时间 那就是未读的,

2.修改数据库的未读记录。如果用户点击了这个朋友的面板后还需要修改数据库中与该朋友的全部未读消息设为已读。这个应该没问题,

3.如果用户登录后,又退出去了,用个另外一台手机或者浏览器去登录,我应该重新要把他的未读消息全部查出来,我先去查数据库,可能还有数据在MQ中,那我该怎么取出来??而且在查询数据库的时候这个时候MQ又已经写入一两条到数据库了,这该怎么办,我想要取出完整的未读消息,我实在不晓得怎么做了。我不知道我的问题有没有描述清楚,反正我就是想做个未读已读的功能像QQ那样低配点也无所谓,我想了很多天了头都想破饿了,又没啥经验,我感觉我的方向出问题了,有没有大牛指教下!!!!!!!

加载中
2
斯武丶风晴
斯武丶风晴
巧用缓存,双写数据库。
1
gitOpen_1
gitOpen_1

只消费未读,缓存中数据量小,消费后即可通过缓存写入数据库

返回顶部
顶部