【发布时间】:2017-08-20 06:38:56
【问题描述】:
我有一个根据时间间隔改变值的键。我还想只保留最后的 X 间隔,这样我就不会存储不必要的旧数据。
举个例子:
在 1490572800000-1490659199999(今天)范围内,它应该返回值 a,
对于 1490659200000-1490745599999 范围内的值,它应该返回值 b。
我尝试用哈希实现这个:
hmset mykey 1490572800000-1490659199999 "a" 1490659200000-1490745599999 "b"
然后使用hkeys 或hscan 查询并检查我的时间戳是否在任何哈希字段的范围内,但这似乎有点不对...
我通过在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