朋友圈的廣告引發的頭腦風暴

打開朋友圈,手指向下滑了幾下,又一“廣告狗”!點擊頭像 ---- 右上角 ---- 設置朋友圈權限 ---- 不看他的朋友圈。一套動作下來,如行云流水,動作利索。再下拉刷新,不到一秒的時間,廣告沒了,朋友圈再度一片清新氣象~

慢著,別走!我不是標題黨!這就奔主題!!

”不到一秒的時間“,重新刷新,剛剛屏蔽的消息就沒了,作為程序猿,當然好奇這是如何實現的,腦海里冒出了一個問題:”微信朋友圈的數據是如何存儲和拉取的?“

首先假設A,B,C,D的關系如下:

好友關系.png

當A發布了一條朋友圈,B評論了A的朋友圈,來分析下微信朋友圈的設計需求:

  • A發布的消息誰能看?

    1. A的好友能查看
    • 非屏蔽A的好友圈的好友能查看
    • 非被A屏蔽的好友能查看
  • B在A的消息中的評論和贊誰能看?

    1. A和C的共同好友能查看

帶著問題,我想到了兩種方案:

方案一:

用最愚蠢的方法,每個用戶都有一張表來保存自己的朋友圈的消息,當A發布一條消息時,除了屏蔽的和被屏蔽的的好友,把該消息插入A的所有好友中。同理,評論和贊都插入A和B的共同好友中。

  • 優點:易實現;查詢快。
  • 缺點:數據量大,如果一個用戶有幾百的好友,發布一條消息就得存儲幾百份,單從這點,這方案就不可取了。更新數據量龐大,如果A把消息刪除了,要通知所有好友刪除... 不愿再想下去了...

方案二:

否定了方案一后,我想到了用索引。每個用戶的朋友圈是維護了一條索引鏈和自己發布的消息表。A發布了一條消息,保存到自己的消息表中,除了屏蔽的和被屏蔽的的好友,把該消息的索引插入所有好友的索引鏈中。當如C打開朋友圈時,C按照索引從每個好友的消息表中拉取數據。同理,評論和贊也如此。

  • 優點:相對方案一,數據量明顯減少。
  • 缺點:查詢慢,每次刷新都從好友的表中查詢,如果有幾百個好友,是不可能做到”不到一秒時間“的!

因為當時是憑空想的,當然很多細節都沒考慮到,但看上去好像能這樣實現,只是不可取而已。其中大家可以注意到我加粗的文字,我犯了一個錯誤:把除了屏蔽的和被屏蔽的的好友與其他好友區分開來,從而導致了數據存儲和加載的復雜度大大提高。我要考慮屏蔽或取消屏蔽時服務器如何處理消息與用戶的關系,并如何通知客戶端更新等等問題,結果想的東西越來越復雜,各種數據縱橫交錯,自己都不敢再想下去了。因為一旦復雜了就是錯誤的!這句話其實是我的好友跟我說的:”編程時,如果一個問題你覺得很復雜,那就永遠無法解決。”

其實不但是編程,任何事情都這樣,如果你先入為主地認為它復雜,到最后你肯定解決不了這件事情。并且,如果你處理事情時,使用的方法越來越復雜,這個方法肯定是錯誤或愚蠢的!肯定有更好的方法可以優雅地解決問題。

但由于我的能力和知識有限,并想不出更好的方案來處理朋友圈的數據存儲和拉取問題,哈哈。但我會查閱資料。直到我看到了下面這篇文章才恍然大悟,果然,很優雅!很簡單!!

微信朋友圈技術之道:三個人的后臺團隊與每日十億的發布量

看了上面的文章后,我自己也整理了一遍:

微信朋友圈的數據存儲和拉取.png

下面對上圖分析下:

關系:

A,B,C互相為好友,A與D為好友。

核心表:
  • 發布表:所有用戶共用(注意,公用不代表存儲在同一個服務器)
  • 相冊表:每個用戶都有自己獨立的相冊
  • 評論或贊表:所有用戶共用,跟發布表是多對一的關系
  • 時間線表:每個用戶都有自己獨立的時間線,也就是朋友圈啦
流程:
  1. 假設A發布了一條朋友圈,服務器會做兩件事:
  • 把該消息存儲到發布表中
  1. 把消息插入每個好友的時間線上,不區分屏蔽或被屏蔽的好友。

  2. B評論或贊了A的朋友圈,服務器也是做兩件事:

  • 把該評論或贊存儲到評論表或贊表中
  1. 關聯對應的消息(其實這步在1中做了,為了更清晰分開講)

  2. C和D打開朋友圈

  • 根據C的時間線向發布表請求數據
  1. 如果是共同好友,加載評論和贊,否則不加載

整個流程下來,邏輯非常清晰,思路非常簡單!當然,實際的設計不會這么簡單,還有很多細節,如數據緩存,服務器部署等等要考慮和處理,這里只是簡述了基本的工作流程而已。

相信聰明的你已注意到,上面的文章根本就沒討論屏蔽與非屏蔽的問題,不是忘了,而是沒必要。后面我想了想,因為消息或友好我們可以選擇屏蔽或取消屏蔽,如果每次操作都要通知服務器進行增刪,那效率不是很低?!所以應該是消息都會存儲到每個用戶的時間線上(這點我應該早點想到的...),至于是服務器查詢時跳過屏蔽的消息,還是客戶端選擇性顯示就不得而知了。

由于本人是搞客戶端的,后端的技術我也不會哈哈,上面的內容只是突然好奇的所思與所想,所以難免會有錯誤的論述。若有錯,歡迎指正。


低頭看下表,從開始想這個問題到寫完這篇文章,用了5個有多的小時,如果覺得有幫助或有趣的話,點下紅心唄~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容