如何存储' expireable' Redis的时间间隔?

时间:2017-03-27 13:54:51

标签: redis

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

举个例子:

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

我尝试用hash实现这个:

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

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

我处理了过期'通过在列表RPUSH中保留mykey-intervals个新区间的单独列表。如果LLEN mykey-intervals > X,我需要删除最早的间隔。然后,我使用LPOP mykey-intervals来检索我HDEL mykey 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 之后的最早区间。

这可以更简单/更好吗?

- 编辑 -

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

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

<div>
  <h2 class="className">
    <a href="#" class="link">Title</a>
  </h2>
</div>

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

2 个答案:

答案 0 :(得分:4)

(使用简短的时间&#39;使它更整洁,)说你想存储&#39; a&#39;在5到10之间,您可以使用ZADD mytimes 7 "a"在它们之间的任何时间存储您的值,例如7,然后使用ZRANGEBYSCORE mytimes 5 10稍后检索该值,这将返回单个值,&# 39;一个&#39 ;.

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

或者你可以随时向下舍入到最近的间隔并存储当时的值,这样你就可以存储一个&#39;在5处,5到10之间的任何值都将向下舍入。取决于您的数据是否会以这种方式运作。

答案 1 :(得分:1)

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