素材牛VIP会员
标记用户是否已读
 陌***4  分类:Java代码  人气:1485  回帖:7  发布于6年前 收藏

我现在有一条消息发布出去,假如有一万人同时接收到,我现在在数据库 增加了一个 字段 存储已读过的用户 的用户名 用逗号隔开, 假如这么多用户的话 那么 这个标记字段长度就得非常长了 这样就不合理了。 所以我想问的是有没什么比较好的方案 对于同一条消息 标记当前用户是否已读过

 标签:oraclemysqljava

讨论这个帖子(7)垃圾回帖将一律封号处理……

Lv1 新人
qi***hu 职业无 6年前#1

你可以新建一个表,用来存储对这条信息已读和未读的信息。
简单帮你设计一个一下这个表如下:

假如这条信息是2017-11-29T12-12-12这个时间点发出的,通过比较用户读这个消息的时间(存储在上表的READ_DATE)这个字段里,如果用户读取这个消息的时间大于这个消息发出的时间,就证明读过这个消息,反之没有读过。

Lv6 码匠
lo***ou 职业无 6年前#2

你可以设计一张 user_id msg_id status的表,存储相应的状态。如果数据库压力大,可以考虑用redis缓存+本地缓存解决。

Lv5 码农
隔***陈 学生 6年前#3

可以用bitmap来存储,把用户id 减去最小的用户id + 1得出的id,在相应的位上用0、1表示是否已读就哦了

Lv5 码农
谁***哥 Web前端工程师 6年前#4

Redis

  1. 消息id作为key存 true 表示未读
  2. 读消息的时候吧这个 key 删掉
Lv4 码徒
sk***e4 页面重构设计 6年前#5

看看这个

Lv6 码匠
85***32 交互设计师 6年前#6

如果用户量不大的话,可以设计一张用户消息表,每给一个用户发一条消息就存储到里面,已读未读就一个字段标识就可以了。用户量大的话会造成很大的存储浪费,可以记录一张消息-用户表,里面只记录读了这条消息的用户,只不过在显示某个用户消息的时候需要做点处理。

Lv7 码师
ha***23 职业无 6年前#7

系统消息和发给用户的消息应该存储在两个不同的表中呀。用户是否已读,是用户的行为,不能附加到系统上去。根据你这个需求,当系统新生成一条消息,在sys_news的表中存储一条记录,这个表可以很简单,有个id,有个内容就行。然后消息发送给用户,分发给那个用户,用户的消息表中user_news中就要增加一条记录。用户消息表要有用户的id,消息的id,消息状态(是否已读)。当用户读了,根据用户的id和消息的id改用户消息表的状态就可以了。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取