2013-03-08 112 views
0

我期待存儲以下信息組。我存儲了一分鐘的時間戳(例如,在1分鐘窗口中看到所有的瀏覽器ID),然後存儲瀏覽器引用列表。我希望只能有一個瀏覽器ID實例Redis中的最佳存儲結構

Redis中的哪些數據結構可以用於此數據結構?有沒有更好的方法來存儲它?

... 
12:06 -> browser1, browser7 
12:07 -> browser8 
12:08 -> browser4, browser5, browser6, browser9 
... 

每行可以有約1天的生存時間。

當添加新的瀏覽器ID時,我首先檢查瀏覽器ID是否已經存在於數據中某處,如果這樣刪除並添加到新的分鐘行。

最後每隔1分鐘我從30分鐘前取出一行並處理這些瀏覽器ID,然後在完全處理時從列表中刪除該行。

在任何時候,此數據結構中可能有多達1百萬個瀏覽器引用。

回答

1

好了,新的信息,新的答案:)

讓我們每一個瀏覽器在數據庫的密鑰,指向哪些時間戳是目前,也爲每一個關鍵。時間戳,它包含一組瀏覽器。

添加新瀏覽器時;

  1. 檢查它是否已經在系統中,檢查它的密鑰是否存在。
  2. 如果是,請檢查它屬於哪個時間戳,將其從舊時間戳中刪除,並將其添加到新的時間戳。更新瀏覽器密鑰。
  3. 如果沒有,請將其添加到時間戳並設置瀏覽器密鑰。

到期我可能不會使用內置的過期鍵,改爲使用cron作業或東西

  1. 在時間戳
  2. 刪除所有瀏覽器鍵刪除時間戳關鍵。

示例數據結構;

ts:12:01 -> {1, 3} 
ts:12:02 -> {2} 

browser:1 -> 12:01 
browser:2 -> 12:02 
browser:3 -> 12:01 

這應該是合理的O(1),但具有略高恆定時間(對於每個操作的多個請求)。可能通過使用服務器端ruby腳本來減少。

希望有幫助!

0

列表就夠了。事實上,如果瀏覽器的數量少於400(根據您的conf文件,但默認爲400),Redis會實施一個連續數組到排列表以節省空間。

要了解詳情:https://github.com/antirez/redis/blob/unstable/src/ziplist.h

+0

任何時候都可能有多達100萬個瀏覽器。因此我按照他們的方式分組數據。這個想法是,當我拉查詢來讓所有在某一特定時間內處於活動狀態的人都快速返回瀏覽器ID列表時。 – 2013-03-11 10:19:40

+1

我認爲你應該將所有瀏覽器存儲在散列表中,以加速查詢,因爲你的瀏覽器太大。 O(1)很棒。 – kaitian521 2013-03-11 10:32:08

+0

我已經更新了問題,以刪除客戶端ID的概念,使其更清晰。所以根據上面的變化,redis存儲集是最適用的。如果我需要多個數據結構,那也不錯。 – 2013-03-11 14:09:05