鍍金池/ 問答/Java  數(shù)據(jù)庫/ 標(biāo)記用戶是否已讀

標(biāo)記用戶是否已讀

我現(xiàn)在有一條消息發(fā)布出去,假如有一萬人同時(shí)接收到,我現(xiàn)在在數(shù)據(jù)庫 增加了一個(gè) 字段 存儲已讀過的用戶 的用戶名 用逗號隔開, 假如這么多用戶的話 那么 這個(gè)標(biāo)記字段長度就得非常長了 這樣就不合理了。 所以我想問的是有沒什么比較好的方案 對于同一條消息 標(biāo)記當(dāng)前用戶是否已讀過

回答
編輯回答
真難過
2018年6月21日 17:51
編輯回答
薄荷綠

Redis

  1. 消息id作為key存 true 表示未讀
  2. 讀消息的時(shí)候吧這個(gè) key 刪掉
2018年2月26日 15:49
編輯回答
愛礙唉

你可以新建一個(gè)表,用來存儲對這條信息已讀和未讀的信息。
簡單幫你設(shè)計(jì)一個(gè)一下這個(gè)表如下:
圖片描述

假如這條信息是2017-11-29T12-12-12這個(gè)時(shí)間點(diǎn)發(fā)出的,通過比較用戶讀這個(gè)消息的時(shí)間(存儲在上表的READ_DATE)這個(gè)字段里,如果用戶讀取這個(gè)消息的時(shí)間大于這個(gè)消息發(fā)出的時(shí)間,就證明讀過這個(gè)消息,反之沒有讀過。

2018年9月5日 20:48
編輯回答
玩控

你可以設(shè)計(jì)一張 user_id msg_id status的表,存儲相應(yīng)的狀態(tài)。如果數(shù)據(jù)庫壓力大,可以考慮用redis緩存+本地緩存解決。

2018年9月15日 00:14
編輯回答
未命名

可以用bitmap來存儲,把用戶id 減去最小的用戶id + 1得出的id,在相應(yīng)的位上用0、1表示是否已讀就哦了

2018年8月30日 03:13
編輯回答
筱饞貓

如果用戶量不大的話,可以設(shè)計(jì)一張用戶消息表,每給一個(gè)用戶發(fā)一條消息就存儲到里面,已讀未讀就一個(gè)字段標(biāo)識就可以了。用戶量大的話會造成很大的存儲浪費(fèi),可以記錄一張消息-用戶表,里面只記錄讀了這條消息的用戶,只不過在顯示某個(gè)用戶消息的時(shí)候需要做點(diǎn)處理。

2017年12月12日 09:05
編輯回答
深記你

系統(tǒng)消息和發(fā)給用戶的消息應(yīng)該存儲在兩個(gè)不同的表中呀。用戶是否已讀,是用戶的行為,不能附加到系統(tǒng)上去。根據(jù)你這個(gè)需求,當(dāng)系統(tǒng)新生成一條消息,在sys_news的表中存儲一條記錄,這個(gè)表可以很簡單,有個(gè)id,有個(gè)內(nèi)容就行。然后消息發(fā)送給用戶,分發(fā)給那個(gè)用戶,用戶的消息表中user_news中就要增加一條記錄。用戶消息表要有用戶的id,消息的id,消息狀態(tài)(是否已讀)。當(dāng)用戶讀了,根據(jù)用戶的id和消息的id改用戶消息表的狀態(tài)就可以了。

2018年2月1日 22:22