如何實現基於 follow 關係的 timeline?

我覺得最關鍵的是資料庫的設計,以微博為例

首先我想到的是:將所有的微博組織為一張表,以發表人 ID 為索引,當用戶請求數據時,首先查找出用戶的 follow 列表,然後從微博表中去匹配。雖然原理上這種方法可行,但是開銷太大 (沒有實際測試過) 。當從微博表中查找時,隨著用戶量的增加,匹配率會很低,每次用戶請求都會從整個微博表中從頭開始查詢。

改進方案是在用戶表和微博表中增加一張表(類似與 djnago 中的 manytomany 模型),以用戶 ID 為索引,微博 ID 為內容,保存每個用戶所有的 timeline 信息,當用戶請求數據時,直接索引即可。但缺點是該表會非常大,因為同樣的微博會被多個用戶看到,那麼在該表中就會有多個行。並且,當用戶發表微博時要更新所有關注該用戶的 timeline, 當用戶取消關注和增加關注時都要遍歷用戶 timeline 更新信息。

我想知道微博和 SNS 網站在 timeline 的實現上的具體技術細節大致是怎樣的?謝謝


http://redis.io/topics/twitter-clone 這上面的設計寫的挺清楚的。用的是redis+php為例。這個twitter-clone的各種版本都有了。

Node.js版:https://github.com/jsoverson/RetwisJS

PHP版:http://code.google.com/p/redis/downloads/list

Java版:https://github.com/SpringSource/spring-data-keyvalue-examples

python版:http://www.google.com.hk/?q=Retwispy

RoR版:http://retwisrb.danlucraft.com/

--------------------------------修正一下

http://redis.io/topics/twitter-clone 上的關於follow關係timeline沒有實現,但是只需要再建立follow關係的隊列而不僅僅是集合就容易實現了,隊列就有先後關係了。


這個跟用django還是啥框架沒關係。信息流是組織數據的一種方式,因為關注的人的ID是離散的,所以用傳統的關係型資料庫來處理,比如mysql來處理的時候就存在問題,比如遇到in查詢無法使用索引,在大數據量的時候就成了慢查詢。解決的辦法是通過redis等NoSQL數據存儲方案來實現push的模型。每個登錄的用戶在redis維護一個定長隊列(比如300或者500),當發一條信息的時候就看看關注自己的人那些在線的,然後把信息主動推送到他們的隊列中去。大體上就是類似的方法了。有現成的仿twitter的Python實現,你可以參考一下


推薦閱讀:

終於等到你——MySQL 5.7與PostgreSQL 9.6的百萬QPS大比拼
如何安裝與連接MySQL?
基於知乎用戶數據的基礎MySQL使用指南
時間序列資料庫漫談
建庫、搬家、開版與其他

TAG:資料庫 | 微博 | 社交產品 | Django框架 | 網站後台 |