以redis格式存储和查询时间间隔数据

时间:2015-03-22 00:01:19

标签: database redis

我必须根据邮政编码缓存程序计划数据。每个邮政编码可以有一天8-20k的节目时间表条目。每个节目时间表条目都是这样的,

program_name,
start_time,
end_time,
channel_no,
..
..

最多可以有10k个邮政编码条目。

现在,我希望以这种方式缓存它,以便我可以在任何时刻查询以获取当前正在运行的程序。对于特定的邮政编码,我想根据以下条件进行查询,

start_time < current_time + 2 minutes AND end_time > current_time

所以,我想到了几种方法。

a)为每个邮政编码使用redis列表。列表将包含所有节目时间表条目。将所有程序计划条目加载到内存中,并根据上面的查询条件对其进行过滤。

b)为每个邮政编码使用2个有序集。一组将使用start_time作为每个节目时间表条目的分数。另一个以end_time作为分数。一旦我们有2组,我可以通过传递得分参数的current_time来为两个集合使用zrangebyscore。然后进行结果集之间的交集。

我想知道是否有更好的方法?

2 个答案:

答案 0 :(得分:3)

列表方法(a)可能性能较差,因为您需要在每个查询中获取整个列表。

排序集更适合此目的,但是您可以通过将分数设置为start_time.length而不是使用两个,而不是使用两个,执行ZRANGEBYSCORE然后在小数部分过滤结果。

此外,无论您是使用两个排序集还是只使用一个,请考虑使用Lua脚本执行查询以避免网络流量并本地化数据处理。

答案 1 :(得分:0)

一段时间后我确实解决了这个问题。想回来并添加我的答案,有人遇到了类似的设计问题。

问题是每个10k的邮政编码都有自己的时间表,因为根据邮政编码,频道编号可能会有所不同。因此,每个邮政编码的计划条目是不同的。这就是我所做的。

  • 我为美国所有频道加载下一小时的时间表。曾经有 大约25k频道号码。我通过将计划从redis加载到本地内存中每小时执行一次。
  • 我还存储了zipcode&lt; - &gt;本地内存中的频道映射。
  • 当我需要特定邮政编码的时间表时,我会获得该邮政编码的频道列表,然后获取与频道编号匹配的时间表条目。因为,我在本地记忆中这样做,表现非常好!
相关问题