?需求:社交APP用戶的好友關(guān)系維護(hù)
? ? ?現(xiàn)有環(huán)境:用戶基本信息表t_userbase,環(huán)信通信接口
? ? ?設(shè)計(jì)方案:
? ? ? 方案一:由后臺(tái)維護(hù)好友關(guān)系
? ? ? 實(shí)施細(xì)則:
? ? ? (1)后臺(tái)新建動(dòng)態(tài)關(guān)系表t_fans,里面四個(gè)字段,id(唯一索引),userid(本用戶ID),fansid(好友用戶ID),以及followTime(創(chuàng)建關(guān)系時(shí)間)
?
? ? ? ? ? ? 當(dāng)用戶A添加用戶B(且用戶B默認(rèn)允許被別人添加)為好友時(shí),如下代碼邏輯
? ? ? ? (2)? 在表中插入兩條記錄,1. userId A? fansId B? ? 2. userId B? fansId A,形成雙向關(guān)系鏈,這樣當(dāng)后臺(tái)查詢該好友的列表,只要判斷和A產(chǎn)生聯(lián)系的對(duì)象是否有雙向鏈,如果有則羅列出來,
/**
* 添加好友 雙向
* @param fromUserId?? ?發(fā)起刪除的用戶ID
* @param toUserId?? ??? ?被刪除的用戶ID
*/
@Override
@Transactional
public void insert(String fromuid,String touid) {
//被添加人
User fansUser = ?userMapper.selectByPrimaryKey(touid);
//添加人
User user =userMapper.selectByPrimaryKey(fromuid);
//正向加好友
Fans fans = new Fans();
fans.setId(UUIDUtils.getUUID());
fans.setFollowTime(STDateUtils.getCurrentTime());
fans.setUserId(touid);
fans.setFansId(fromuid);
fansMapper.insert(fans);
//反向互加好友
fans.setId(UUIDUtils.getUUID());
fans.setUserId(fromuid);
fans.setFansId(touid);
fansMapper.insert(fans);
//環(huán)信添加好友
hUserService.addContacts(fansUser.getHusername(),user.getHusername());
hUserService.addContacts(user.getHusername(),fansUser.getHusername());
}
? ? ? (3)優(yōu)點(diǎn):后臺(tái)維護(hù)好友關(guān)系,對(duì)用戶資源集中管理,擁有大量的寶貴數(shù)據(jù)源,且能快捷定位問題
? ? ? ? ? ? ? ? 缺點(diǎn):對(duì)后臺(tái)性能要求頗高,需要考慮大并發(fā)以及分布式+REDIS+分表分庫。對(duì)于中小型項(xiàng)目方案對(duì)硬件和軟件要求高
? ? ? 方案二:由環(huán)信維護(hù)好友關(guān)系,后臺(tái)進(jìn)行管理
? ? ? 實(shí)施細(xì)則:
? ? ? ?(1)好友關(guān)系存儲(chǔ)在環(huán)信中,只涉及好友基本數(shù)據(jù)(好友的環(huán)信ID)
? ? ? ?(2)APP前端查詢好友時(shí),調(diào)用后臺(tái)接口通信,后臺(tái)調(diào)用環(huán)信接口返回好友基本數(shù)據(jù)環(huán)信ID
? ? ? ?(3)后臺(tái)對(duì)環(huán)信ID進(jìn)行數(shù)據(jù)庫緩存EHCACHE查詢命中,可以列表式查詢到好友詳細(xì)信息(包括昵稱,頭像,地區(qū),性別,簽名等)
? ? ? ? (4)后臺(tái)將數(shù)據(jù)返回給前臺(tái)
? ? ? ? (5)前臺(tái)將列表信息展示成界面
? ? ? ? ?優(yōu)點(diǎn):對(duì)于服務(wù)器維護(hù)基本是輕量級(jí),只要加入ehcache,如果分布式考慮多加入redis即可。
? ? ? ? ?缺點(diǎn):后臺(tái)無法知曉用戶的關(guān)系圈
? ? ? ? 綜上:比較兩種方案,選擇方案二