存儲好友關系
Ⅰ 補齊短板-開源IM項目OpenIM關於初始化/登錄/好友介面文檔介紹
OpenIM文檔方面的建設一直遠遠落後於開發, 也經常被開發者詬病,在接下來一周的時間里,我們重點補齊文檔,讓開發者更輕松接入。由於app sdk底層都是go來實現,所以本文先寫一個模板和框架,在接下來的時間里,會有iOS、Android、Flutter、Uniapp、jssdk同事補充具體的細節,並更新到官網
![0](C:\Users\Administrator\Desktop\OpenIM\官網相關\技術文章\6-25\0.png)
## 初始化及登錄
初始化並登錄成功回調,是正常使用OpenIM 服務的前提
| SDK | 描述 |
| :--------------- | :----------------------------------------------------------- |
| [Login] | 登錄,如果登錄成功,必須退出登錄才能再次執行登錄操作 |
| [Logout] | 退出登錄 |
| [GetLoginStatus] | 獲取登錄狀態, 101:登錄成功, 102:登陸中, 103:登錄失敗, 201:退出登錄 |
| [GetLoginUser] | 獲取當前登錄用戶UserID,此時用戶登錄狀態未知 |
| [initSDK] | 初始化 SDK,整個生命周期執行一次,登錄相關監聽介紹如下: |
OpenIM和調用方利用監聽回調機制,和調用方信息互通,把登錄狀態通過非同步回調方式即時傳遞給調用方,確保信息及時傳達而不阻塞其主線程。
## 監聽說明
| 登錄相關監聽 | 回調描述 |
| :------------------- | :----------------------------------------------------------- |
| [OnConnecting] | 連接中,在連接後台時(包括重連)回調 |
| [OnConnectSuccess] | 連接成功 |
| [OnConnectFailed] | 連接失敗,如果因網路連接失敗會重連,其他情況不重連 |
| [OnKickedOffline] | 被踢下線,可能由於多端登錄策略所致,或後台管理員強制其退出登錄 |
| [OnUserTokenExpired] | 檢測token過期回調 |
## 調用流程
OpenIM調用流程分為如下幾步:
(1)初始化:在整個生命周期執行一次
(2)設置監聽:包括群組監聽,好友監聽,用戶監聽,消息及會話監聽,這些監聽會在其他章節中描述
(3)登錄:登錄回調成功後再執行其他操作,否則可能出現資源載入未完成的錯誤
(4)收發消息等操作;
## 好友管理相關介面
OpenIM提供好友關系託管,比如好友申請,同意,以及好友獲取等,OpenIM在客戶端本地存儲好友關系,並結合消息通知機制,按需調用後台介面,確保本地和服務端數據一致。同時利用監聽機制,把數據變化通過非同步回調傳達調用方。OpenIM在收發消息時,默認不檢查好友關系,您可以在配置文件中自行修改。OpenIM好友關系是雙向關系,A添加B為好友後,則A在B的好友列表中,B也在A的好友列表中,A刪除B,僅僅只是刪除A的好友列表,而B的好友列表不受影響。同樣,黑名單也類似。
| SDK | 描述 |
| :----------------------------- | :------------------------------------------------------- |
| [GetDesignatedFriendsInfo] | 獲取指定好友的信息 |
| [GetFriendList] | 獲取所有的好友列表 |
| [SearchFriends] | 通過關鍵詞搜索好友 |
| [CheckFriend] | 檢查是否好友關系 |
| [AddFriend] | 發起添加好友請求 |
| [SetFriendRemark] | 設置好友備注 |
| [DeleteFriend] | 刪除好友(單向刪除) |
| [GetRecvFriendApplicationList] | 獲取我收到的添加好友申請列表 |
| [GetSendFriendApplicationList] | 獲取我發起的的添加好友申請列表 |
| [AcceptFriendApplication] | 同意好友申請 |
| [RefuseFriendApplication] | 拒絕好友申請 |
| [SetFriendListener] | 設置好友、黑名單相關監聽,用於UI層實時感知數據變化並刷新 |
## 監聽說明
好友監聽器的作用:調用方設置好友監聽,好友關系的變化會通過OpenIM消息機制實時同步到需要感知的在線用戶,包括用戶的其他端,調用方根據回調事件做相關的數據處理。
比如用戶B在Android端添加用戶A為好友,用戶A(所有在線的終端)收到B的好友申請,則A調用GetRecvFriendApplicationList獲取收到的好友申請列表,刷新界面。同時,用戶B在線其他的終端比如PC端也會收到通知,B調用GetSendFriendApplicationList獲取發起的好友申請列表,刷新B發出的好友申請列表。
當然也可以利用回調的參數信息,做增量處理,而不用獲取全量的好友申請列表。
以用戶B申請添加用戶A為例
| 好友及黑名單監聽 | 描述 |
| :---------------------------- | :--------------------------------------------------- |
| [OnFriendApplicationAdded] | 好友申請列表增加,主動發起者和被動添加者會收到 |
| [OnFriendApplicationDeleted] | 好友申請列表刪除,主動刪除者會收到 |
| [OnFriendApplicationAccepted] | 好友申請被同意,主動發起者和被動添加者會收到 |
| [OnFriendApplicationRejected] | 好友申請被拒絕,主動發起者和被動添加者會收到 |
| [OnFriendAdded] | 好友增加,用戶好友增加時會收到 |
| [OnFriendDeleted] | 好友刪除,用戶好友減少時會收到 |
| [OnFriendInfoChanged] | 好友信息改變,用戶好友信息(比如昵稱等)改變時會收到 |
| [OnBlackAdded] | 黑名單增加,用戶黑名單增加時會收到 |
| [OnBlackDeleted] | 黑名單移除,用戶黑名單減少時會收到 |
## 項目介紹
OpenIM繼續領跑開源IM領域,在廣大開發者的支持下,目前github star突破9k。在數據泄露、信息外泄、隱私濫用的時代,IM私有化部署需求旺盛。其中,政企協同辦公對IM需求猛增,隨著信息化技術的迭代升級以及信創產業加速落地和實踐,協同辦公軟體的發展潛力將進一步被釋放。「安全可控「逐步成為第一要素。對於社區交友領域,暴露出的隱私安全問題越來越多,私有化部署確保用戶數據不泄露。
OpenIM從服務端到客戶端SDK開源即時通訊(IM)整體解決方案,可以輕松替代第三方IM雲服務,打造具備聊天、社交、辦公功能的app。
github地址: https://github.com/OpenIMSDK/Open-IM-Server
開發者中心:https://doc.rentsoft.cn/#/
## OpenIM團隊
創始團隊來自資深IM技術團隊,我們致力於用開源技術創造服務價值,打造輕量級、高可用的IM架構,開發者只需簡單調用 SDK,即可在應用內構建多種即時通訊及實時音視頻互動場景。OpenIM優勢:開源,安全,可靠,低成本。對於信息安全重視的電子政務,企業協同辦公,OpenIM都是非常好的選擇。
從公司成立之初就將「開源」作為核心戰略來推進,開源充分體現了自由、平等、分享的互聯網精神。
OpenIM邀請全球技術極客參與技術優化,讓開發者輕松集成,讓每一個應用都具備IM功能,同時考慮企業的接入成本、伺服器資源以及最重要的數據安全性和私密性。
Ⅱ 微信卸載重新安裝後,微信好友還在嗎
微信的好友關系是存儲在微信的伺服器的,不會隨著你的手機端微信卸載就沒了,不管怎麼卸載,在別的手機微信登錄相同的賬號,你的好友都在,放心吧,丟失的都是你的聊天記錄,但你提前備份了也就沒什麼損失了,祝你好運!
Ⅲ 如何維持朋友關系
1、真誠
真誠是人際交往的最基本的要求,所有的人際交往的手段、技巧都應該是建立在真誠交往的基礎之上的。爾虞我詐的欺騙和虛偽的敷衍都是對人際關系的褻瀆。真誠不是寫在臉上的,而是發自內心的,偽裝出來的真誠比真正的欺騙更令人討厭。
任何人在人際交往過程中都有明顯的對自我價值感的維護的傾向。例如,當我們取得了成績時,我們會解釋為這是自己的能力優於別人的緣故;當別人取得了成績而我們沒有取得成績時,我們就會解釋為別人僅僅是機遇好而已。這樣的解釋就不至於降低自我的價值感,傷及自尊心。
Ⅳ 各位大拿,我最近想做一個類似旺旺的聊天工具,但是現在困惑於旺旺中好友關系,聊天存儲,好友信息存儲!
沒做過,幫你猜測一下。
1.好友關系應該是存儲到資料庫里邊的,這個就是一個分類,應該不難吧。
2.好友信息只需要顯示少量的信息就可以,除非單獨查看
3.我看現在聊天記錄一般是存儲在本地的機器的,qq會員好像是存到伺服器的
Ⅳ 好友關系的多對多表格
好友關系建立一個表friends,用戶信息另外建一個表person. friends里就只有uid,friend_id兩個欄位,分別代表一個用戶和它的一個好友的ID。具體的用戶信息就存儲在person表中,例如用戶ID、用戶名、生日等詳細信息。表person和表friends可以通過friends的uid或friend_id和表person的ID欄位關聯起來。
Ⅵ 如何設計數據結構和演算法,計算並存儲六度好友關系
數據結構的存儲結構是和相應的數據在內存中的物理地址之間的關系有關。而邏輯結構只是描述數據之間的關系(三大邏輯結構的一種)。舉例說,線性表(元素之間的邏輯關系是線性的)可以是順序存儲的方式
Ⅶ 社交網路如何設計存儲好友關系的資料庫的
社交網路,他們都有,各自的資料庫來對你的,各個數據信息,來進行獨立的儲存,所以好友關系也是他們資料庫中的一條信息而已
Ⅷ 圖的表示:如何存儲微博、微信等社交網路中的好友關系
x博中,兩個人可以互相關注,互加好友,那如何存儲這些社交網路的好友關系呢?
這就要用到:圖。
和樹比起來,這是一種更加復雜的非線性表結構。
樹的元素稱為節點,圖中元素叫作頂點(vertex)。圖中的一個頂點可以與任意其他頂點建立連接關系,這種建立的關系叫作邊(edge)。
社交網路就是典型的圖結構。
把每個用戶看作一個頂點。如果兩個用戶之間互加好友,就在兩者之間建立一條邊。
所以,整個微信的好友關系就可用一張圖表示。
每個用戶有多少個好友,對應到圖中就叫作頂點的度(degree),即跟頂點相連接的邊的條數。
不過微博的社交關系跟微信還有點不同,更復雜一點。微博允許單向關注,即用戶A關注用戶B,但B可不關注A。
這就引入邊的「方向」。
A關注B,就在圖中畫一條從A到B的帶箭頭的邊,表示邊的方向。A、B互關,就畫一條從A指向B的邊,再畫一條從B指向A的邊,這種邊有方向的圖叫作「有向圖」。邊沒有方向的圖也就叫「無向圖」。
無向圖中有「度」:一個頂點有多少條邊。
有向圖中,把度分為:
QQ社交關系更復雜,不僅記錄用戶之間的好友關系,還記錄了兩個用戶之間的親密度,如何在圖中記錄這種好友關系親密度呢?
這就要用到帶權圖(weighted graph),每條邊都有個權重(weight),可以通過這個權重來表示QQ好友間的親密度。
最直觀的一種存儲方法,鄰接矩陣(Adjacency Matrix)。
依賴一個二維數組:
無向圖,若A[i][j]==1,則A[j][i]==1。實際上,只需存儲一個即可。即無向圖的二維數組,如果將其用對角線劃分為上下兩部分,則只需利用上或下面這樣一半空間就夠了,另外一半其實完全浪費。
如果存儲的是稀疏圖(Sparse Matrix),即頂點很多,但每個頂點的邊並不多,則更浪費空間。
如微信有好幾億用戶,對應到圖就是好幾億頂點。但每個用戶好友並不很多,一般也就三五百個而已。如果我們用鄰接矩陣來存儲,那絕大部分的存儲空間都被浪費了。
但這也並不是說,鄰接矩陣的存儲方法就完全沒有優點。首先,鄰接矩陣的存儲方式簡單、直接,因為基於數組,所以在獲取兩個頂點的關系時,就非常高效。其次,用鄰接矩陣存儲圖的另外一個好處是方便計算。這是因為,用鄰接矩陣的方式存儲圖,可以將很多圖的運算轉換成矩陣之間的運算。比如求解最短路徑問題時會提到一個Floyd-Warshall演算法,就是利用矩陣循環相乘若干次得到結果。
針對上面鄰接矩陣比較浪費內存空間,另外一種圖存儲,鄰接表(Adjacency List)。
有點像散列表?每個頂點對應一條鏈表,鏈表中存儲的是與這個頂點相連接的其他頂點。圖中畫的是一個有向圖的鄰接表存儲方式,每個頂點對應的鏈表裡面,存儲的是指向的頂點。對於無向圖來說,也是類似的,不過,每個頂點的鏈表中存儲的,是跟這個頂點有邊相連的頂點,你可以自己畫下。
如上圖示例,若要確定是否存在一條從頂點2到頂點4的邊,就要遍歷頂點2的鏈表,看其中是否存在頂點4,而鏈表存儲對緩存不友好。所以鄰接表查詢兩個頂點之間的關系較為低效。
基於鏈表法解決沖突的散列表中,若鏈過長,為提高查找效率,可將鏈表換成其他更高效數據結構,如平衡二叉查找樹。
鄰接表長得很像散列。所以,也可將鄰接表同散列表一樣進行「優化」。
可將鄰接表中的鏈表改成平衡二叉查找樹。實際可選用紅黑樹。即可更快速查找兩個頂點之間是否存在邊。
這里的二叉查找樹也可換成其他動態數據結構,如跳錶、散列表。
還可將鏈表改成有序動態數組,通過二分查找快速定位兩個頂點之間是否存在邊。
雖然微博有向圖,微信是無向圖,但對該問題,二者思路類似,以微博為例。
數據結構服務於演算法,選擇哪種存儲方法和需支持的操作有關。
對於微博用戶關系,需支持如下操作:
因為社交網路是一張稀疏圖,使用鄰接矩陣存儲比較浪費存儲空間。所以,這里採用鄰接表。
但一個鄰接表存儲這種有向圖也是不夠的。查找某用戶關注了哪些用戶很容易,但若想知道某用戶都被哪些用戶關注了,即粉絲列表就沒法了。
因此,還需一個逆鄰接表,存儲用戶的被關注關系:
基礎的鄰接表不適合快速判斷兩個用戶是否為關注與被關注關系,所以進行優化,將鄰接表的鏈表改為支持快速查找的動態數據結構。
因需按照用戶名稱首字母排序,分頁獲取用戶的粉絲列表或關注列表,跳錶最合適:插入、刪除、查找都非常高效,時間復雜度 ,空間復雜度稍高,是 。
跳錶存儲數據先天有序,分頁獲取粉絲列表或關注列表,非常高效。
對小規模數據,如社交網路中只有幾萬、幾十萬個用戶,可將整個社交關系存儲在內存,該解決方案沒問題。
可通過哈希演算法等數據分片方案,將鄰接表存儲在不同機器:
如下圖,在機器1上存儲頂點1,2,3的鄰接表,在機器2上,存儲頂點4,5的鄰接表。逆鄰接表的處理方式也一樣。當要查詢頂點與頂點關系的時候,我們就利用同樣的哈希演算法,先定位頂點所在的機器,然後再在相應的機器上查找。
還能藉助外部存儲(比如硬碟),因為外部存儲的存儲空間比內存多很多:
如用下表存儲這樣一個圖。為高效支持前面定義的操作,可建多個索引,比如第一列、第二列,給這兩列都建立索引。
Ⅸ 用戶的好友關系,在資料庫里怎麼存儲
1、使用冗餘,每個人的好友信息都在資料庫中有存儲,就是你說的記錄一對一關系
2、數據緩存到內存,數據訪問很快
3、狀態信息修改非同步,比如一個人登陸了,他的好友不是馬上就知道,中間間隔幾秒也沒有關系
4、數據可能不放在關系資料庫中,可能使用nosql資料庫,比如mongodb,bigtable,cassandra等
5、facebook,twitter就是用類似的思想