2013-01-02 24 views
1

我正在爲我的應用程序創建一個簡單的活動流。使用Redis作爲活動流的鍵/值存儲

目前的技術層和邏輯如下:

**有關的活動的所有數據被存儲在MYSQL和所有活動的ID的陣列保持在Redis的爲每個用戶**

  1. 用戶執行操作並將活動直接存儲在MYSQL的「活動」表中,並返回唯一的'activity_id'
  2. 的這個用戶的「追隨者」從數據庫和每個跟隨檢索到一個數組我推這個新ACTIVITY_ID到他們的名單在Redis的

當用戶查看他們的流時,我根據他們的用戶標識從redis中檢索活動標識的數組。然後,我執行一個簡單的MYSQL WHERE IN($ids)查詢來獲取所有這些活動ID的實際活動數據。

這種設置我相信是相當可擴展的,因爲查詢總是非常簡單的查詢。但是它提出了幾個問題。

  1. Removing a Follower - 如果用戶停止關注的人,我們需要刪除所有ACTIVITY_ID的是,從他們的的Redis列表中的用戶相對應。這需要遍歷Redis列表中的所有ID,並刪除與刪除的用戶相對應的ID。這讓我覺得很不起眼,有沒有更好的方法來管理這個問題?
  2. 'archiving' - 我想將Redis列表的長度保持爲 ,假設1000個activity_id是最大值,並頻繁修剪MYSQL活動表中的舊數據,以防止其增長到無法管理的大小。顯然,當我們添加一個新的 時,可以通過從用戶流列表中刪除舊ID來實現 。不過,我不確定如何歸檔這些數據,因此用戶可以根據需要查看非常舊的活動數據。 什麼是最好的方法來做到這一點?或者我只是更好地執行 完全執行此限制,並阻止用戶查看非常舊的活動數據?

總結:我真的想知道的是,如果我的當前設置/邏輯是一個好/壞主意。我需要一個全面的反思嗎?如果是這樣,你推薦的模型是什麼?如果你覺得一切都好,我應該如何解決上述兩個問題?我意識到這個問題相當廣泛,所有的答案都將基於意見,但這正是我正在尋找的。良好的意見。

非常感謝提前。

+0

嘿,有趣的問題。最近我一直在使用redis的發佈和訂閱功能。對於需要保留我使用MongoDB的數據的情況。我最終做的是用我們的主應用程序(使用php編寫)發佈到redis服務器,然後使用一個小型的node.js應用程序訂閱頻道並將消息保存到MongoDB或MySQL。我提到這一點的原因是,也許將所有數據保存在一個數據庫中可能會更有效,然後將密鑰存儲在redis中並將值存儲在mysql中。但這僅僅是我對redis的相對短暫的體驗......祝你好運! – Opentuned

+0

@StefanCross - 謝謝我將更密切地關注發佈/訂閱功能。也許這是要走的路線。 – gordyr

回答

1

1似乎並不那麼難以執行(無循環):

delete Redis from Redis 
join activities on Redis.activity_id = activities.id 
       and activities.user_id = 2 
       and Redis.user_id = 1 
; 

2我真的不知道有關存檔。您可以在每個時間段創建歸檔表,並定期將舊錶活動從主表移動到歸檔表。看起來像一個正確的標準化活動表應該能夠變得相當大。(確保任何「大型」活動將活動數據存儲在單獨的表格中,主活動表應該是「窄」的,因爲它預計有很多條目)

相關問題