【问题标题】:How do I store this in Redis?如何将其存储在 Redis 中?
【发布时间】:2011-06-18 10:03:17
【问题描述】:

我有很多产品 (product_id)。用户 (user_id) 查看产品。

我想查询过去 24 小时内哪些用户查看了任何产品。 (换句话说,我想保留一个附加到该 product_id 的 user_ids 列表......当用户的 24 小时结束时,该用户会弹出该列表并且记录消失)

如何将其存储在 Redis 中?谁能给我一个高级架构,因为我是 Redis 新手。

【问题讨论】:

    标签: database model schema redis


    【解决方案1】:

    对于类似的事情,我使用了一个排序集,其中值是用户 ID,分数是当前时间。更新集合时,使用 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 来检索要显示的实际项目。

    【讨论】:

    • 你能解释一下它是如何工作的吗?我很困惑。排序后的集合包含什么?
    【解决方案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:*"

    【讨论】:

    • 这是一种可扩展的方式吗?使用 * 的查找速度有多快?
    • 这是一个哈希表查找,所以它应该很快,但不是 100% 理想的。在 redis 网站上有更多关于key pattern lookups 的信息。对于真正可扩展的东西,你应该选择 Tom Clarkson 的答案。
    • 只是想补充一点,如果你想要两全其美,你可以使用 EXPIRE 在你的 Sorted Set 上设置一个 24 小时时钟,那么超过 24 小时不访问的用户将被自动修剪从数据库中提取,您只需对仍然存在的键(您的活动用户)进行 ZREMRANGEBYSCORE。
    • 你能详细解释一下 sorted-set 方法吗?排序集中的内容是什么?如果我在做 ZREMRANGEBYSCORE,为什么我需要 EXPIRE?
    • 我不认为使排序集过期会起作用 - 它只能删除整个集,因为过期应用于包含该集的键而不是该集的成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多