消息功能中系统通知这一类信息的已读未读除了用数据表之外有没有比较好的解决方案

网站中消息功能,系统消息这一类如何实现已读未读,如果是要在数据库记录每个用户对于此条系统消息的信息,
例如用户信息表中记录:
用户1,消息id1,读取状态1
用户2,消息id1,读取状态0
如果用户量庞大怎么办,例如100万用户,每个用户都记录系统消息,数据量会很大,
如果不用记录表的方法能实现有没有更好的解决方案

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16
chowjiawei

做个公告 不行吗 都要每个人去确认一遍公告 是否有必要呢

如果有必要的话 我也等一下答案 哈哈

2周前 评论
touchfishman (楼主) 2周前

之前有类似项目, 不过不是我做的,公司 另一个后端

大概实现做成多对多, 消息表/中间表/用户表, 已读字段存中间表, 这个项目中消息还有一个删除已读, 但是也是逻辑删除, 同样存中间表字段, 这样设计查询比较麻烦

2周前 评论
thebestxt

之前做过类似的消息系统。消息存一个表,消息-用户存另一个表。

消息表只存消息本身,消息id,消息内容,来自谁,发送至,创建时间

消息-用户表存消息状态。ID,消息ID,uid,已读状态,删除状态。

每次用户发消息给别人,消息表存1条,消息用户表存两条,分别对应两个人对消息的状态,例如删除,已读。

但这个方法只能用于数据量少的应用,我们当时两万用户就已经顶不住了。。

2周前 评论

可以表中添加查看人字段,存已读用户的ID,稍微好一点

2周前 评论
王小大 2周前

没有魔法,我看阿里云,也经常发站内信。

2周前 评论

全部用户都看的消息还好, 但是那种面向特定条件用户发的消息就很麻烦了, 所以还是加个中间表....

2周前 评论

如果对应的值只有0和1,可以用bit map来解决存储空间的问题。redis中也有bit map。

2周前 评论
笑逐颜凯

偷懒,前端自己缓存处理。再做个过期机制,默认多久的消息就自动标为已读。 :speak_no_evil:

2周前 评论

问下站长这里的已读未读是怎么做的 :joy:

2周前 评论

消息表和用户消息表分开不就行了,一对一的两张表同时存,一对多的只存在消息表,满足条件的用户拉取的时候才存到用户消息表

2周前 评论
chowjiawei

看标题 楼主不想要存数据库的方式~

2周前 评论

我做过,讲一下吧,很简单的解决方案

使用redis的bitmap

//设置用户已读:
$redis->setBit('message:'.$msg_id, $uid, 1);

//获取是否读取状态:
$redis->getBit('message:'.$msg_id, $uid);

//支持千万级用户,并且不会有数据存储方面的压力

另外:bitmap还可以做签到,活跃统计,在线状态等等…

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!