我必须根据邮政编码缓存程序计划数据。每个邮政编码可以有一天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。然后进行结果集之间的交集。
我想知道是否有更好的方法?
答案 0 :(得分:3)
列表方法(a)可能性能较差,因为您需要在每个查询中获取整个列表。
排序集更适合此目的,但是您可以通过将分数设置为start_time.length
而不是使用两个,而不是使用两个,执行ZRANGEBYSCORE然后在小数部分过滤结果。
此外,无论您是使用两个排序集还是只使用一个,请考虑使用Lua脚本执行查询以避免网络流量并本地化数据处理。
答案 1 :(得分:0)
一段时间后我确实解决了这个问题。想回来并添加我的答案,有人遇到了类似的设计问题。
问题是每个10k的邮政编码都有自己的时间表,因为根据邮政编码,频道编号可能会有所不同。因此,每个邮政编码的计划条目是不同的。这就是我所做的。