原创 | 基于红黑树的高效IP归属地查询方案
Posted 携程风控
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创 | 基于红黑树的高效IP归属地查询方案相关的知识,希望对你有一定的参考价值。
数据衍生问题
本文我们将以IP归属地为例,介绍一下如何实现相对静态数据的高效衍生。我们会把IP归属地信息保存到内存中,经过一系列的转变,最终形成红黑树,利用红黑树高效的查找性能,实现了高效的IP归属地解析方案,该方案可承担较大的并发访问压力、并拥有极低的响应延时。
准备工作
图 1
图 2
图 3
图 4
红黑树是一种非常成熟的数据结构,是每个结点都带有红色或者黑色的二叉查找树,是比较高效的,可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。红黑树在满足二叉查找树的要求外,还必须满足以下要求:
1. 节点是红色或黑色。
2. 根是黑色。
3. 所有叶子都是黑色(叶子是NIL节点)。
4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
具体步骤
JSON是一种数据格式,主要用于数据交换,易于人阅读和编写,同时也易于计算机解析和生成。
{"region":"天津", "start":"1.15.232.0", "end":"1.15.232.255", "city":" 天津", "country":"中国"},
{"region":"辽宁", "start":"1.14.33.0", "end":"1.14.33.255", "city":" 大连", "country":"中国"},
{"region":"北京", "start":"1.15.186.0", "end":"1.15.186.255", "city":" 北京", "country":"中国"},
{"region":"北京", "start":"1.12.27.0", "end":"1.12.27.255", "city":" 北京", "country":"中国"},
其中start为该城市连续IP段的起始IP,end为结束IP。
表 1
type |
name |
1 |
中国 |
6 |
天津 |
2 |
辽宁 |
4 |
大连 |
6 |
北京 |
把上面的Area类的集合数据转成raw-meta数据,其中index为Area类的集合索引。
表 2
type |
name |
index |
1 |
中国 |
0 |
6 |
天津 |
1 |
2 |
辽宁 |
2 |
4 |
大连 |
3 |
6 |
北京 |
4 |
表 3
国家索引 |
地区索引 |
城市索引 |
开始IP |
结束IP |
0 |
1 |
1 |
1.15.232.0 |
1.15.232.255 |
0 |
2 |
3 |
1.14.33.0 |
1.14.33.255 |
0 |
4 |
4 |
1.15.186.0 |
1.15.186.255 |
0 |
4 |
4 |
1.12.27.0 |
1.12.27.255 |
进一步,表3中第3、4行的国家索引、地区索引,城市索引是相同,国家为中国,地区为北京,城市为北京,为了消除重复数据,再把fomatted-raw-ip数据转换为segment-regions-ip数据。
表 4
国家索引 |
地区索引 |
城市索引 |
fomatted-raw-ip索引 |
0 |
1 |
1 |
0 |
0 |
2 |
3 |
1 |
0 |
4 |
4 |
2 |
把IP归属地信息和segment-regions-ip数据转为compact-ex-ip-segment数据,其中第一行为segment-regions-ip的索引。
表 5
segment-regions-ip的索引 |
开始IP |
结束IP |
0 |
1.15.232.0 |
1.15.232.255 |
1 |
1.14.33.0 |
1.14.33.255 |
2 |
1.12.27.0 |
1.12.27.255 |
2 |
1.15.186.0 |
1.15.186.255 |
表 6
segment-regions-ip的索引 |
开始IP |
结束IP |
0 |
17819648 |
17819903 |
1 |
17703168 |
17703423 |
2 |
17570560 |
17570815 |
2 |
17807872 |
17808127 |
最后把compact-ex-ip-segment转成红黑树保存在计算机内存中,每个红黑树结点由parent,left,right,color,from,end,index组成。parent 为父节点,left为左结点,right为右结点,color 表示该结点为红色或者黑色,from为起始IP转成的long整数,end为结束IP转成的long整数,index为compact-ex-ip-segment数据保存的索引,即表6的第一列。
该方案不仅适用于IP归属地查询,也适用于其他相对静态的数据的快速解析。
携程金融风险管理部
Make the Travel more Free and Securely
以上是关于原创 | 基于红黑树的高效IP归属地查询方案的主要内容,如果未能解决你的问题,请参考以下文章