面試官:如何設(shè)計(jì)群聊消息的已讀未讀功能?
企業(yè)IM比如企業(yè)微信、釘釘里面的群消息的有個(gè)已讀未讀的功能,發(fā)送者剛發(fā)出消息時(shí),當(dāng)前群里其他群成員都是未讀狀態(tài),陸陸續(xù)續(xù)有人看了這個(gè)消息,這時(shí)候消息的詳情變成x人已讀,y人未讀,如下圖所示,有具體的已讀未讀列表(萬惡的功能,看到同事or老板的消息不能假裝沒看到了),每條消息對應(yīng)一個(gè)唯一的messageid(uint64_t),每個(gè)用戶對應(yīng)一個(gè)唯一的userid(uint64_t),應(yīng)該如何保存這個(gè)消息對應(yīng)的已讀未讀詳情呢?

對于每一個(gè)messageid,存當(dāng)前readids + unreadids,當(dāng)群成員A已讀某一條消息時(shí),把A userid從unreadids移除寫到readids上就好了,客戶端更新到messageid對應(yīng)的詳情列表,就可以展示m人已讀,n人未讀
struct?UserInfo?
{?
?uint64_t?userid;
?uint32_t?mapid;
};
struct?GroupMetaInfo?
{
?vector??members;
?string?name;
?uint32_t?maxid;
?//?other?info
};
{?uint32_t?maxid,?uint8_t?readbit[]}
退出的成員呢?比如C退出群,發(fā)消息時(shí)maxid還是5,已讀+未讀總?cè)藬?shù)應(yīng)該是3(不包括發(fā)消息者本人),目前信息只有5個(gè)bit(0/1),識(shí)別不出來誰已經(jīng)退出群聊了 退出群聊的成員如何處理?從GruopMetaInfo里面刪除么?退出群聊成員重新加入又如何分配id呢?
增加自增mapid字段,一個(gè)群聊維護(hù)一份,成本幾乎可以忽略不計(jì) 每個(gè)成員已讀未讀由8B(64bit)優(yōu)化成2bit,減少62/64, 200人已讀未讀舊的方案1600B, 現(xiàn)在只需要(200/8) * 2 + 4 = 54 , 每條消息節(jié)約95%+
作者:小袁學(xué)習(xí)筆記
來源:www.toutiao.com/i6686735232772604429/
(完)
?關(guān)注公眾號(hào):Java后端編程,回復(fù)下面關(guān)鍵字?
要Java學(xué)習(xí)完整路線,回復(fù)??路線?
缺Java入門視頻,回復(fù):?視頻?
要Java面試經(jīng)驗(yàn),回復(fù)??面試?
缺Java項(xiàng)目,回復(fù):?項(xiàng)目?
進(jìn)Java粉絲群:?加群?
PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。
(完) 加我"微信"?獲取一份 最新Java面試題資料 請備注:666,不然不通過~
最近好文
1、再見了,收費(fèi)的XShell,我改用國產(chǎn)良心工具!
3、SpringBoot快速開發(fā)利器:Spring Boot CLI
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:關(guān)注公眾號(hào)并回復(fù)?java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 明天見(??ω??)??
評論
圖片
表情
