天天看點

php + Redis 寫的類似于新浪微網誌的feed系統

    最近接了一個feed系統的外包,類似于微網誌那種!用戶端是ios和android,伺服器用的php,資料庫用的是redis。分享下伺服器和資料庫部分的功能!希望對大家有幫助。

    首先是使用者基本資訊部分,包含賬号,昵稱,簽名,公司還有頭像,我們使用redis的hash結構(一種類似于map鍵值對的資料結構)結構如下:(大家在做的時候,還是用hgetall的指令,這樣隻會有一次的網絡請求),注意隻是基本資訊,諸如玩家的粉絲,關注和文章,我們采取其他的資料結構體來存儲!

    核心1:關注和粉絲系統!每個使用者都要維護自己的關注和粉絲系統!分别用user:$uid:followings 和 user:$uid:followers兩個字段展現,使用的是redis的集合類型(相當于java裡面的hashset和stl中的set,集合中的元素唯一)!

     收聽某使用者(mutli是redis提供的一種事務,這樣,就可以避免産生諸如,你收聽了某人,而猶豫異常,别人的粉絲中缺沒有你的現象)

  取消收聽某使用者:

    核心2:下面談談文章的更新:

   首先是文章的基本資料結構,同上面使用者的基本資料結構,采用redis的hash結構:

  每當使用者釋出一個文章的時候,他的所有的粉絲必須看得到他的文章才可以!這裡我們有推和拉兩種方式,對于現在的新浪微網誌,據說是采取推和拉結合的兩個方式,我們的小系統。推:每當使用者發表一個新貼子的時候,就将他的文章的id主動告知他所有的粉絲。拉:使用者釋出一個新的文章什麼都不要做,而當他的粉絲請求最新的内容的時候,則需要便利他所有的關注人,取得最新的文章,然後按照時間排序取出來。推比較消耗記憶體,拉則是比較消耗cpu。據說新浪微網誌采用推和拉結合的方式,比如當一個普通使用者則是推,但是如果是一個大明星有着幾千萬粉絲的大号,當釋出一個文章的時候,則是需要他的粉絲通過拉的方式來擷取!

  使用者釋出一個新文章的操作:

   我們将所有的文章id推到粉絲的("user:$uid:news")中,這裡采用的是順序隊列結構體!基本也就是按照時間進行了排序(最新的文章總是左邊)!我們不會将文章的内容全部到放到這個字段裡,而是值存放了文章的id,使用者請求新鮮事的時候,自己再去拉取文章的内容!

   熱門使用者/熱門文章,redis提供了一種有序集合類型,這樣我們利用這種有序集合類型可以做熱門,熱門使用者排行和熱門文章排行!比如我們可以根據使用者的粉絲數量做排行,很容易得到前二十名熱門使用者,根據文章的閱讀量做熱門文章的排行了!

   這樣一個簡單的feed系統就算是完成了!但是如果要做大,确實還是有很多系統要做!

   android用戶端部分的内容,我們下篇文章見!