我有一个应用程序(nodejs/express),需要根据一天中的时间和星期几查找要应用的路由规则。REDIS - 创建有意义的键来减少查询
因此,例如,我有以下业务规则:
-
在星期一和星期二
- 09:00 GMT和12:00 GMT之间,我需要路由对象农行“位置x”。
- 周二13:00到13:30我需要将ABC路由到“位置y”。
(为了这个讨论的目的,真的没关系ABC是什么对象。)
我两个选择之间的辩论,据我应该如何设计我的Redis数据库我的钥匙
选项1
让天信息中的对象数据的一部分,是这样的:
HMSET routing_rules:objectABC_09:00_12:00 days 'mon tues' location X
HMSET routing_rules:objectABC_13:00_13:30 days 'tues' location Y
这种方法的
优势 - 当它的时间来更新天名单我可以简单地这样做:
HMSET routing_rules:objectABC_09:00_12:00 days 'mon tues thu'
这里的缺点是,为了找到合适的规则,我必须让两个查询.. ..首先做一个SCAN命令来找到合适的时间范围......然后如果有匹配的话......做另一个查询来查找天数值。
选项2
包括周信息的一天的关键
HMSET routing_rules:objectABC_09:00_12:00_mt location X
HMSET routing_rules:objectABC_13:00_13:30_t location Y
的一部分,我会用像
m = monday
t = tuesday
w = wed
r = thursday
etc.
优点命名约定来选择2是为了根据当前时间和日期找到正确的路由规则,我只需要运行一个SCAN命令(我们可以假设我的扫描命令将返回一杆的结果)
但缺点选项2的是,当我需要一个新的一天增加的关键,我认为我需要删除键和值。 ..然后重新创建它。它是否正确?
而现在,我知道如何删除的唯一方法是对对象中的每个值做一个HDEL,然后删除该键。 因此,举例来说,我一直在做这样的事情:
127.0.0.1:6379> HDEL routing_rules:objectABC_00:00_00:00 days 'mon tues' location x
,我必须列出的所有对象的值删除整个键/值对。 在这个例子中,它并没有那么糟糕,因为我只有两个值 - 这个键 - 位置和天数字段。但是如果有更多的数据,它会有点麻烦。除了与此关键字相关的字段数外,我不确定是否还有其他因素需要考虑。
如果您对如何设计此按键以获得最佳性能和维护方面有任何建议,我完全理解。我看到它的方式,至少有一次无法避免运行扫描。但这是我的第一个redis数据库尝试,所以我提前为补救性问题/ noob错误道歉。
编辑1
假设我有足够的内存,并假设我只需要保存一个字段/每键值,让我们说我创造了我的钥匙是这样的:
SET routing_rules:objectABC_09:00_12:00_m X
SET routing_rules:objectABC_09:00_12:00_t X
SET routing_rules:objectABC_13:00_13:30_t Y
而且现在请求进入对象ABC,星期一在UTC 11。因为我的键表示开始时间和结束时间(又名范围),所以我没有看到如何在没有执行扫描的情况下找到正确的键/值对。
我错过了什么吗?
帕斯卡,什么会被视为条目数“高”值? – Happydevdays
与服务器上的可用内存相比,它取决于每个键+值的内存大小。 –
我认为我将有大约15 GB使用...和50,000个对象,每个对象最多有5个路由规则。 – Happydevdays