2011-06-14 92 views
2

我有很多產品(product_id)。用戶(user_id)查看產品。如何將此存儲在Redis中?

我想查詢哪些用戶查看過去24小時內的任何產品。 (換句話說,我想保留附加到該product_id的user_id列表...並且當用戶24小時後,該用戶彈出該列表並且該記錄消失)

如何存儲此在Redis中?有人可以給我一個高級架構,因爲我是Redis中的新成員。

回答

3

對於類似的東西,我使用了一個排序集,其值爲用戶標識,分數爲當前時間。更新集合時,使用ZREMRANGEBYSCORE刪除較舊的項目以及更新當前用戶的時間分數。

更新,代碼:

每當一個新的項目補充說:

ZREMRANGEBYSCORE recentitems 0 [DateTime.Now.AddMinutes(-10).Ticks] 
ZADD recentitems [DateTime.Now.Ticks] [item.id] 

爲了得到過去10分鐘內,加入項目的ID:

ZREVRANGEBYSCORE recentitems [DateTime.Now.Ticks] [DateTime.Now.AddMinutes(-10).Ticks] 

注意可以也可用

ZREVRANGE recentitems 0 -1 

如果您不介意該設置可能包含較舊的項目,如果最近沒有添加任何項目。

給你一個項目id的列表。然後根據需要使用GET/MGET/HGET/HMGET來檢索顯示的實際項目。

+0

你能解釋一下這是如何工作?我很困惑。有序集合包含什麼?用代碼更新了 – TIMEX 2011-06-17 23:48:48

+0

。 – 2011-06-18 02:03:41

2

如果你想讓redis鍵自動退出,那麼你可能會想要爲每個user_id-to-product_id映射使用一個redis鍵。所以,你會寫redis.set "user-to-products:user_id:product_id", timestamp之後的redis.expire "user-to-products:user_id:product_id" 86400(24小時,以秒爲單位)。

獲取當前的列表,你應該能夠做到redis.keys "user-to-products:user_id:*"

+0

這是一種可擴展的方式嗎?用*查找速度有多快? – TIMEX 2011-06-15 05:44:27

+0

這是一個哈希表查找,所以它應該很快,但不是100%理想。在redis網站上有關於[關鍵模式查找]的更多信息(http://redis.io/commands/keys)。對於真正可擴展的東西,你應該跟湯姆克拉克森的答案一起去。 – 2011-06-16 01:59:59

+0

只是想添加,如果你想要兩全其美的最好的,你可以使用EXPIRE在你的Sorted Set上設置一個24小時的時鐘,那麼不會訪問超過24小時的用戶會自動從數據庫中刪除,而你只有到ZREMRANGEBYSCORE仍然存在的密鑰(您的活動用戶)。 – 2011-06-16 02:04:07

相關問題