2011-07-26 105 views
0

我試圖建立一個系統,其中用戶發佈的所有鏈接以及他們的關注者點擊都存儲在redis中,以滿足以下要求:Redis數據結構存儲所有鏈接的所有點擊

  1. 能夠在一個時間範圍內(可以是今天,本週,所有時間或自定義)獲得(例如10%)大多數點擊鏈接。

  2. 能夠查詢發佈相同鏈接的所有用戶。

  3. 由於我們已經使用了許多密鑰,理想的是我們將所有這些存儲在單個Redis密鑰中。

  4. 如果需要,可以將值編碼爲JSON。

這裏是我想出迄今:

-I使用一個Redis的哈希,每個字段都是一個小時,這樣在一天,即哈希將包含24場。

- 在每一個領域,我從存儲陣列編碼與格式的JSON:

array("timestamp1" => array($url1, $url2, ...) 
    , "timestamp2" => array($url3, $url4, ...) 
    , ..., ...); 

-The完整的結構是這樣的哈希:

[01/01/2010 00:00] => JSON(...), 
[01/01/2010 01:00] => JSON(...), 
.... 

這樣一來,我可以得到所有的點擊任何時間範圍內的任何網址。

但是,我似乎無法重複使用此散列來獲取發佈該URL的所有用戶。

現在的問題是:有沒有更好的方法呢?

2011年7月30日更新:我正在存儲分鐘,小時,天,周,月和年在同一個散列。

所以,點擊保存在許多領域一次: - 在該領域的分(格式YmdHi) - 在該領域的時間(格式YmdH) - 在現場爲天(格式Ymd) - 在該字段中(格式爲YW) - 在該月的字段中(格式爲Ym) - 在該年的字段中(格式Y)。

這是方式,試圖讓一個具體的時間表時,我只能訪問必要的字段withouth的通過時間循環。

例如,如果我需要從07/26/2011 20:00到07/28/2011 02:00點擊,我只需要查詢7個字段:2011年7月27日全天的1個字段,4場從20:00小時至23:00 07/26,以及從​​00:00至01:00小時07/28

回答

2

然後2個字段如果你放棄了第三個要求變得很容易。很多人似乎認爲你應該總是使用散列而不是密鑰,但是這是因爲誤解了關於在特定的有限環境中使用哈希來提高性能的帖子。

爲了獲得最被點擊的鏈接,爲每個小時或一天的有序set,取值爲鏈接和得分是點擊設置使用ZINCRBY。使用ZCARD和ZREVRANGEBYSCORE獲得前10%。如果該集合包含系統中的所有鏈接,這是最簡單的,但如果需要,還可以使用策略從集合中刪除不太受歡迎的項目。

要讓所有用戶發佈鏈接,請爲每個鏈接存儲一組用戶。您可以使用JSON和鏈接的密鑰或散列存儲詳細信息來完成此操作,但一組設置可以更新和查詢。

+0

謝謝你,先生克拉克森! 如果每個小時使用有序集合,是否會有太多密鑰? 1年的點擊次數在Redis中需要8760個密鑰。再加上系統中已經有數百萬個密鑰,這可能是過度的,是嗎? 另外,我需要一個時間框架內的頂部被點擊的鏈接。例如,「自上週以來獲得10%的點擊率最高的鏈接」。這將涉及訪問許多有序集合。 – sntran

0

我建議使用一些水桶策略像哈希鍵或使鏈接的記錄,以用戶每月明智的,你沒有對數據結構是如何巨大,可能增加的尺寸控制。將有數百萬用戶訪問特定的鏈接。現在再次獲得所有用戶的詳細信息,如果立即拋出,這將是沒有用的。我相信可以做的事情是維護計數器或一些像當前狀態一樣的元數據,然後將存檔存儲保存在mem中。或去存儲網格狀的GemFire

相關問題