IP 范围的键值存储

Key-Value Store For IP Ranges

我有一个大型数据集,如下所示:

这些列是:IP 开始、IP 结束、位置。 它本质上是指开始和结束ip之间范围内的所有IP。

希望将其存储在键值存储 (Cloudflare Workers KV) 中,但是没有查询功能。我只能做一个get(key).

有没有一种方法可以构造此数据(每个 ip 没有一行),以便我可以轻松地为任何给定的 ip 获取正确的行?

一些想法:

  • The list() methodlimit: 1 将 return 列表范围中的第一项,这样可以更容易地“扫描” table . list() 只有 return 的键,没有值,但它还有 return 的元数据;如果你的值适合元数据,你可以放在那里 list() 会 return 它。不幸的是,list() 不允许您指定范围,只能指定前缀,因此制定查询可能有点棘手。此外,list() 操作在计费和性能方面都比 get() 更昂贵。

  • 另一种可能的设计可能是按子网对数据进行批处理,例如为每个 /24 存储一个键,其中值包含 /24 下的所有范围(我使用 /24 作为示例,但更大的尺寸可能有意义,具体取决于数据集)。然后您只需为特定 IP 地址执行一次查找,查找其周围的子网。作为额外的优化,如果经常看到比单个 /24 大得多的 IP 范围,例如,您可以将它们存储为 /16s,然后在每次查找时您需要检查 /24/16 键。或者,也许很少有足够“大”的范围,您可以将它们直接嵌入到您的 Worker 脚本中,而无需进行查找。作为一个额外的好处,如果您正在查找客户端的 IP,这种方法可能会更好地利用缓存。同一子网中的客户端往往位于同一位置并访问相同的 Cloudflare 托管服务器,因此如果它们都映射到您的 KV 命名空间中的同一键,那么数据在该托管服务器的缓存中往往会很热。