标记用户是否已读

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

阅读 8k
7 个回答

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

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

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

Redis

  1. 消息id作为key存 true 表示未读
  2. 读消息的时候吧这个 key 删掉

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题