我有很多产品(product_id)。用户(user_id)查看产品。如何将此存储在Redis中?
我想查询哪些用户查看过去24小时内的任何产品。 (换句话说,我想保留附加到该product_id的user_id列表...并且当用户24小时后,该用户弹出该列表并且该记录消失)
如何存储此在Redis中?有人可以给我一个高级架构,因为我是Redis中的新成员。
我有很多产品(product_id)。用户(user_id)查看产品。如何将此存储在Redis中?
我想查询哪些用户查看过去24小时内的任何产品。 (换句话说,我想保留附加到该product_id的user_id列表...并且当用户24小时后,该用户弹出该列表并且该记录消失)
如何存储此在Redis中?有人可以给我一个高级架构,因为我是Redis中的新成员。
对于类似的东西,我使用了一个排序集,其值为用户标识,分数为当前时间。更新集合时,使用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来检索显示的实际项目。
如果你想让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:*"
这是一种可扩展的方式吗?用*查找速度有多快? – TIMEX 2011-06-15 05:44:27
这是一个哈希表查找,所以它应该很快,但不是100%理想。在redis网站上有关于[关键模式查找]的更多信息(http://redis.io/commands/keys)。对于真正可扩展的东西,你应该跟汤姆克拉克森的答案一起去。 – 2011-06-16 01:59:59
只是想添加,如果你想要两全其美的最好的,你可以使用EXPIRE在你的Sorted Set上设置一个24小时的时钟,那么不会访问超过24小时的用户会自动从数据库中删除,而你只有到ZREMRANGEBYSCORE仍然存在的密钥(您的活动用户)。 – 2011-06-16 02:04:07
你能解释一下这是如何工作?我很困惑。有序集合包含什么?用代码更新了 – TIMEX 2011-06-17 23:48:48
。 – 2011-06-18 02:03:41