如题,想做一个消息提示,具体问题如下如果系统给所有用户推送了一条站内消息,如何区分用户是否已读,从而实现取消红点或具体未读消息数量,总不可能所有消息全部放在一个表吧,那如果有1万个用户,那不是同样的消息要发1万条,如果是数据库的话,长久下来,负担太大了吧,当然更不可能放在内存中,不然重启项目,消息就全没了。所以敢问大佬,有啥好的设计方案,不限数据库,redis,或者其他工具
2 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
如果系统有redis可以这么处理,redis的set保存已经读取得消息id=messageIdeg:{messageid1,messageid2...}。userid_read_message作为键(每个用户存一条,保存每个用户已经读取的所有messageid)最终既是这种结构your_user_id_read_message:{messageid1,messageid2...}那么此时已读消息数量和具体消息的id可知,消息自然可知直接用id查表。没有redis直接用数据库也行,反正建一张表记录用于已经读取的消息id列表。拼接成字符串也好直接存JSON格式的也好,都行。目的是通过用户id能获取到该用户已经读取的消息ID。每个用户的每条已读消息存一条记录这样最好,直接通过sql就可以把这个已读未读,以及具体消息内容都能查出来。站内信在数据库建表common_notice_message用于保存具体的站内信,一条就算你发10W个人也指用存一条。那么notin第一步中的已读messageid就可以查到所有未读的消息,自然数量和具体内容也就出来了。当用户读取了未读消息(web或者app上调用了读具体消息的接口)直接在redis的已读消息id的set中新增一条记录。
炎炎设计
TA贡献1808条经验 获得超4个赞
使用redis的hash实现:hash的名称unread_msg_counthash的键user_idhash的值未读数如果有新消息可以使用hincrby(unread_msg_count,user_id,1)来处理用户已读时,hincrby(unread_msg_count,user_id,-1)来减1或者hdel(unread_msg_count,user_id)性能和持久性要求都可以保证
添加回答
举报
0/150
提交
取消