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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 26

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

使用redis的bitmap

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

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

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

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

2年前 评论
touchfishman (楼主) 2年前
sabercode 2年前
supperdiyer 2年前
小天天天天 (作者) 2年前
sabercode 2年前
小天天天天 (作者) 2年前
sabercode 2年前
小天天天天 (作者) 2年前

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

使用redis的bitmap

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

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

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

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

2年前 评论
touchfishman (楼主) 2年前
sabercode 2年前
supperdiyer 2年前
小天天天天 (作者) 2年前
sabercode 2年前
小天天天天 (作者) 2年前
sabercode 2年前
小天天天天 (作者) 2年前

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

2年前 评论
chowjiawei

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

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

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

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

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

2年前 评论

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

2年前 评论

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

2年前 评论
thebestxt

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

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

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

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

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

2年前 评论

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

2年前 评论
王小大 2年前

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

2年前 评论

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

2年前 评论

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

2年前 评论
chowjiawei

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

2年前 评论

gk.link/a/10ViE

gk.link/a/10ViG

可以去看下这两章,有详细的解答

2年前 评论
porygonCN

思路哈

  • 公告类型的跟定向用户通知在两个表里存
  • 公告类的加一个多对多已读表
  • 通知类的就用la的默认notifications

至于说用户量大了之后

  • 通过redis缓存通知 [id=>readed] 这样
  • 定期把数据维护到数据库(总要有个持久化的位置 redis当然也行 只要不嫌占内存)
  • 用户量真能百万,就不可能是la一个项目了 多半会有专门的通知系统
2年前 评论

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