使用redis
的hash
实现:
unread_msg_count
user_id
未读数
hincrby(unread_msg_count, user_id, 1)
来处理hincrby(unread_msg_count, user_id, -1)
来减1或者hdel(unread_msg_count, user_id)
性能和持久性要求都可以保证
数据库层面只要键两种表就行了,message
表和message_user_last_ack
表,第二张表存放用户最后一个已读消息的ID,比如某用户存了message_55
,那么message_55
之前的都是已读,之后的都是未读的,所以消息只用存一份就行了。
8 回答6.4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
如果系统有redis可以这么处理,
redis
的set
保存已经读取得消息id =messageId
eg:{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个人也指用存一条。那么
not in
第一步中的已读messageid
就可以查到所有未读的消息,自然数量和具体内容也就出来了。当用户读取了未读消息(web或者app上调用了读具体消息的接口)直接在redis的已读消息id的set中新增一条记录。