我有一个根据时间间隔改变值的键。我还想保留最后X
个时间间隔,以便我不会存储不必要的旧数据。
举个例子:
在范围1490572800000-1490659199999(今天)它应该返回值a
,
对于范围1490659200000-1490745599999中的值,它应返回值b
。
我尝试用hash实现这个:
hmset mykey 1490572800000-1490659199999 "a" 1490659200000-1490745599999 "b"
然后使用hkeys
或hscan
进行查询,并检查我的时间戳是否在任何哈希字段的范围内,但这似乎有点不合适......
我处理了过期'通过在列表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,并在我的时间戳之后删除所有开始时间,只留下时间戳之前的开始时间。然后我复制了结束时间并删除了时间戳之前的所有结束时间。相交这些集合只留下了我所需时间戳的间隔。
答案 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)
您可以使用以下方法之一:
请参阅Intersection of two or more sorted sets - 在您的情况下,年龄可以是时间间隔的开始时间和工资结束时间。
探索redimension:https://github.com/RedisLabs/lua-redimension