高频业务:一种IP网段判断重叠的算法(其四)

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

本文探讨IP网段重叠算法的工程实现,提出以IP前缀树替代二分法,实现最长前缀匹配,具备查找快、易动态更新的优势。通过统一业务属性池、连续内存存储和并发查询优化内存,大幅压缩千万级IP记录的内存占用,适用于高频IP业务碰撞场景。

🔎

延伸解读

从二分法到前缀树:为何更优

文章指出,二分法依赖IP段的起始和结束点,但数轴上是线段而非离散点,因此并非最优。IP前缀树将IP转为二进制,按位匹配,天然支持最长前缀匹配,且插入删除简单,动态更新容易。对于高频IP业务碰撞场景,前缀树能更快定位IP所属业务属性,避免二分法在大量线段中的低效遍历。

内存压缩:统一属性池与连续内存

面对300万IP记录、10个属性,文章估算哈希表可能占用1-1.5GB内存。为压缩内存,作者提出统一Entry池:业务标签数量随IP增长趋于稳定,重叠存储多,用属性池指针替代重复存储,将业务维度从O(M*N)降为O(N)。同时将前缀树节点放入连续内存,提升查询速度。这些工程化手段对千万级记录尤为重要。

并发与现成方案:ClickHouse ip_trie

文章提到,IPv4/IPv6可分开并发,单个数组内查询也可并发,因为查询只是在树上行走,互不干扰。此外,若使用ClickHouse,其ip_trie类型字典天然支持IP前缀树,可直接使用,无需自行实现。这为工程落地提供了便捷选择,尤其适合已使用ClickHouse的团队。

❓

Q&A

IP前缀树相比二分法在IP网段重叠判断中有什么优势?

IP前缀树天然适配最长前缀匹配,查找快(按位匹配),插入/删除简单,动态更新容易,无需匹配其他条目,并且能够应用连续内存优化,提升搜索性能。

如何用IP前缀树实现最长前缀匹配?

将IP地址转换为二进制,从根节点开始逐位向下匹配,0走左节点,1走右节点,遍历过程中记录最近一次命中的有效前缀节点,遍历结束后返回最长匹配结果。

IP前缀树的节点结构是怎样的?

节点包含左右子节点指针(Zero和One)、是否有效前缀(IsPrefix)以及当前节点的附加值(Tags,如业务属性)。

如何压缩IP前缀树的内存占用?

使用统一Entry池维护业务属性,IP索引持有属性池指针,将业务维度从O(M*N)降为O(N);同时将二叉树节点放入连续内存,提高查询速度。

IP前缀树支持并发查询吗?

支持。IPv4和IPv6可以分开并发,单个数组内的所有查询也可以分开并发,因为查询只是在树上行走,互不影响。

有哪些现成工具可以直接使用IP前缀树?

ClickHouse的ip_trie类型的dict天然支持IP前缀树,可以直接使用。

🏷️

标签

➡️

继续阅读