我試圖建立一個系統,其中用戶發佈的所有鏈接以及他們的關注者點擊都存儲在redis中,以滿足以下要求:Redis數據結構存儲所有鏈接的所有點擊
能夠在一個時間範圍內(可以是今天,本週,所有時間或自定義)獲得(例如10%)大多數點擊鏈接。
能夠查詢發佈相同鏈接的所有用戶。
由於我們已經使用了許多密鑰,理想的是我們將所有這些存儲在單個Redis密鑰中。
如果需要,可以將值編碼爲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
謝謝你,先生克拉克森! 如果每個小時使用有序集合,是否會有太多密鑰? 1年的點擊次數在Redis中需要8760個密鑰。再加上系統中已經有數百萬個密鑰,這可能是過度的,是嗎? 另外,我需要一個時間框架內的頂部被點擊的鏈接。例如,「自上週以來獲得10%的點擊率最高的鏈接」。這將涉及訪問許多有序集合。 – sntran