2011-06-14 55 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

相关问题