2015-08-28 65 views
0

我正在網站上工作。我想獲得關於設計的反饋。網站功能類似於Reddit,ProductHunt等(即基於投票)。以下是概述 1.後端服務從網絡獲取帖子並存儲到數據庫中。 2.帖子顯示在網站上(頂部,新)。 3.頂部按排名顯示網站(投票,時間因素)。 4.在滾動,用戶看到更多帖子基於投票的網站/應用程序的結構

設計:

數據庫表:帖子,用戶,投票

後端服務: 後端服務定期並將從Web上獲取的職位爲DB(帖子表)。

網站: 當用戶訪問網站的用戶看到最新帖子。根據請求,網站代碼查詢數據庫,該數據庫返回基於時間和投票排名的鏈接。當使用特定帖子投票時,網站代碼將其添加到數據庫。網站允許登錄並將用戶信息存儲在用戶表中。

問題: 我應該考慮使用Redis緩存而不是查詢數據庫來獲取每個請求上的排名帖子嗎?如果是,那麼應該存入什麼緩存以及更新緩存的邏輯是什麼?

如果我最終使用緩存,那麼緩存應該有兩個條目。 1.排名的職位1.新職位。對於排名後的應該定期後臺服務更新緩存?和新的職位,我應該無效緩存每當新的帖子從網頁中獲取?

也如何處理無限滾動,如果我去緩存路由?示例:用戶根據排名查看帖子。用戶在15分鐘後滾動查找新帖子。那時排名可能已經改變。

我將不勝感激任何反饋/幫助!

回答

0

我認爲Redis會在性能方面爲您提供很多幫助,您可以將它用作緩存,也可以用作真實數據庫(它擁有您所需的一切 - 持久性,備份,主從複製,服務器端羣集)。
如果你想使用它作爲一個高速緩存,這是你可以做什麼:

  • 對於排名的帖子就可以使用Sorted Sets。這將允許你有每個職位的分數,這將是投票的數量,它會保持你的帖子根據這個分數排序。你有一個提高現有職位得分的命令 - ZINCRBY。當你更新數據庫
  • 對於新的職位,你可以使用lists您可以更新的同時緩存,因爲你可以很容易地在列表中,當創建一個新的崗位前添加元素,運用LPUSH,並保持它使用LTRIM
  • 對於無限滾動有更多的解決方案的固定長度的,都擁有各自的價格:您可以使用命令ZRANGEBYSCORE與限制參數,以獲得 訂購的物品,所以如果事情在此期間改變了你可能不顯示它
  • 此外,無論何時您需要以原子方式執行2個或更多個命令,例如,如果您希望爲創建的新帖子始終保持l atest 50你需要打LPUSH和LTRIM作爲一個命令,你可以用LUA Scripting
+0

謝謝@Liviu!確實非常有用。我仍然無法找出分頁。讓我們舉個例子:基於投票的有序集:a,b,x,g,d,e,c,f,y,s。基於投票的10件物品的訂單。頁面顯示5項。當用戶滾動下5個項目時顯示。在用戶滾動查找下一個項目之前,請設置更改和發佈順序。新集合看起來像:a,b,f,y,x,g,s,d,e,c。一些項目從前5移到下一個桶,第二頁的一些項目移到第一個。滾動會給重複的項目以及它會錯過一些項目。 –

+0

沒有完美的解決方案,最簡單的方法是在用戶請求時創建一個快照(如果有很多併發用戶,這會消耗大量內存)。但是如果你想在服務器上有一個遊標,你需要一些id來轉發它,而不是集合的大小。在你的情況下,如果分數只能上升,那麼就有可能使用它。你在第一頁上收到的最後一個元素是d,所以你需要記住它的分數,當你問第二頁時,你只需要從該分數下降,所以你應該只接收e和c,從而避免重複。 https://dev.twitter.com/rest/public/timelines –