【问题标题】:How to store 'expireable' time intervals in Redis?如何在 Redis 中存储“过期”时间间隔?
【发布时间】:2017-08-20 06:38:56
【问题描述】:

我有一个根据时间间隔改变值的键。我还想只保留最后的 X 间隔,这样我就不会存储不必要的旧数据。

举个例子:

在 1490572800000-1490659199999(今天)范围内,它应该返回值 a, 对于 1490659200000-1490745599999 范围内的值,它应该返回值 b

我尝试用哈希实现这个:

hmset mykey 1490572800000-1490659199999 "a" 1490659200000-1490745599999 "b"

然后使用hkeyshscan 查询并检查我的时间戳是否在任何哈希字段的范围内,但这似乎有点不对...

我通过在RPUSH 列表mykey-intervals 中保留一个单独的列表来处理“过期”。如果LLEN mykey-intervals > X,我需要删除最旧的间隔。然后,我使用LPOP mykey-intervals 检索最早的间隔,然后我从mykey 检索HDEL

这可以做得更简单/更好吗?

-- 编辑--

我最终使用排序集的解决方案:

以下示例中使用的句点是:a[5-10]、b[11-16]、c[17-22],我搜索的时间戳是 7。

ZADD start-times 5 a 11 b 17 c
ZADD end-times 10 a 16 b 22 c
ZUNIONSTORE temp-start 1 start-times WEIGHTS 1
ZREMRANGEBYSCORE temp-start (7 +inf
ZUNIONSTORE temp-end 1 end-times WEIGHTS 1
ZREMRANGEBYSCORE temp-end -inf (7
ZINTERSTORE result 2 temp-start temp-end

首先我创建了 2 个 zset,一个用于存储间隔开始时间,另一个用于存储结束时间。然后,我将开始时间复制到另一个(临时)zset 中,并在我的时间戳之后删除了所有开始时间,只留下时间戳之前的开始时间。然后我复制了结束时间并删除了时间戳之前的所有结束时间。与集合相交只剩下覆盖我想要的时间戳的间隔。

【问题讨论】:

  • 为什么不将值 a 存储在使用时间作为键的排序集中,然后使用 ZRANGEBYSCORE 检索特定时间之间的值?然后您可以 ZREMRANGEBYSCORE 删除旧值。
  • 分数是几点?间隔的开始?可以写个简单的例子吗?

标签: redis


【解决方案1】:

(使用较短的“时间”使其更整洁,)假设您想在 5 到 10 之间存储“a”,您可以在它们之间的任何时间存储您的值,例如 7,使用 ZADD mytimes 7 "a",并且然后稍后使用ZRANGEBYSCORE mytimes 5 10 检索该值,这将返回单个值“a”。

稍后当您达到更高的时间时,您可以使用 ZREMRANGEBYSCORE mytimes 0 100 删除所有小于 100 的时间。

或者,您可以将所有时间四舍五入到最接近的间隔并存储当时的值,因此您将“a”存储为 5,并且 5 到 10 之间的任何值都将被四舍五入。是否会以这种方式工作取决于您的数据。

【讨论】:

  • 我在脑海中严重地把这个复杂化了......试图弄清楚如何设置 2 个时间戳的分数......我想我知道从哪里开始,谢谢!
  • 我刚刚尝试实现这个,我想我撞到了墙......如果我只将间隔的开始或结束时间设置为分数,我如何检查我的时间戳是否是在区间?如果您查看我的哈希答案,我只提供了我希望检查的时间戳,而不是整个时间间隔。如果我 ZADD mytimes 5 "a" 间隔 5-10 我不能使用 ZRANGEBYSCORE 因为我不知道间隔,我只想检查一个时间戳。如果我的时间戳是 12,我不知道“a”是否在我的区间内。有什么建议吗?
  • 间隔是否一致?总是24小时吗?然后你可以向下舍入到最接近的 24 小时。
  • 也许您可以将值存储在范围的开头和结尾,并使用 ZRANGEBYSCORE mytimes 5 +inf LIMIT 0 1 检索它,这样您就可以在之后取回第一个值你现在的时间。
【解决方案2】:

您可以使用以下方法之一:

【讨论】:

  • 我之前没有使用过 zsets,所以我不确定我是否可以做得更好,你介意看看我的编辑吗?此外,与我最初提出的哈希解决方案相比,这个解决方案的性能是否更好?因为复制和删除数据似乎需要做很多工作。
  • 看起来您的编辑已正确调整。这将比扫描整个哈希 imo 更有效,但实际上 zset 操作也很昂贵。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2013-12-18
  • 2011-09-20
相关资源
最近更新 更多