IP 范围的键值存储
Key-Value Store For IP Ranges
我有一个大型数据集,如下所示:
这些列是:IP 开始、IP 结束、位置。
它本质上是指开始和结束ip之间范围内的所有IP。
希望将其存储在键值存储 (Cloudflare Workers KV) 中,但是没有查询功能。我只能做一个get(key)
.
有没有一种方法可以构造此数据(每个 ip 没有一行),以便我可以轻松地为任何给定的 ip 获取正确的行?
一些想法:
The list()
method 和 limit: 1
将 return 列表范围中的第一项,这样可以更容易地“扫描” table . list()
只有 return 的键,没有值,但它还有 return 的元数据;如果你的值适合元数据,你可以放在那里 list()
会 return 它。不幸的是,list()
不允许您指定范围,只能指定前缀,因此制定查询可能有点棘手。此外,list()
操作在计费和性能方面都比 get()
更昂贵。
另一种可能的设计可能是按子网对数据进行批处理,例如为每个 /24
存储一个键,其中值包含 /24
下的所有范围(我使用 /24
作为示例,但更大的尺寸可能有意义,具体取决于数据集)。然后您只需为特定 IP 地址执行一次查找,查找其周围的子网。作为额外的优化,如果经常看到比单个 /24
大得多的 IP 范围,例如,您可以将它们存储为 /16
s,然后在每次查找时您需要检查 /24
和 /16
键。或者,也许很少有足够“大”的范围,您可以将它们直接嵌入到您的 Worker 脚本中,而无需进行查找。作为一个额外的好处,如果您正在查找客户端的 IP,这种方法可能会更好地利用缓存。同一子网中的客户端往往位于同一位置并访问相同的 Cloudflare 托管服务器,因此如果它们都映射到您的 KV 命名空间中的同一键,那么数据在该托管服务器的缓存中往往会很热。
我有一个大型数据集,如下所示:
这些列是:IP 开始、IP 结束、位置。 它本质上是指开始和结束ip之间范围内的所有IP。
希望将其存储在键值存储 (Cloudflare Workers KV) 中,但是没有查询功能。我只能做一个get(key)
.
有没有一种方法可以构造此数据(每个 ip 没有一行),以便我可以轻松地为任何给定的 ip 获取正确的行?
一些想法:
The
list()
method 和limit: 1
将 return 列表范围中的第一项,这样可以更容易地“扫描” table .list()
只有 return 的键,没有值,但它还有 return 的元数据;如果你的值适合元数据,你可以放在那里list()
会 return 它。不幸的是,list()
不允许您指定范围,只能指定前缀,因此制定查询可能有点棘手。此外,list()
操作在计费和性能方面都比get()
更昂贵。另一种可能的设计可能是按子网对数据进行批处理,例如为每个
/24
存储一个键,其中值包含/24
下的所有范围(我使用/24
作为示例,但更大的尺寸可能有意义,具体取决于数据集)。然后您只需为特定 IP 地址执行一次查找,查找其周围的子网。作为额外的优化,如果经常看到比单个/24
大得多的 IP 范围,例如,您可以将它们存储为/16
s,然后在每次查找时您需要检查/24
和/16
键。或者,也许很少有足够“大”的范围,您可以将它们直接嵌入到您的 Worker 脚本中,而无需进行查找。作为一个额外的好处,如果您正在查找客户端的 IP,这种方法可能会更好地利用缓存。同一子网中的客户端往往位于同一位置并访问相同的 Cloudflare 托管服务器,因此如果它们都映射到您的 KV 命名空间中的同一键,那么数据在该托管服务器的缓存中往往会很热。