前几天,看网上说IPV4的地址已经分配完了,IPV6的时代开始了。其实工信部早就开始推各个大公司进行IPV6改造了,不过进度不尽如人意。说到IPV4就不能不提IP转换服务了,IP转换服务是指根据用户的IP获取用户的国籍、省份、城市、运营商等信息的服务。可以被使用到诸如用户画像、版权控制、流量调度、路径加速等领域。

那该怎么做一个IP转换服务呢?
1.获取IP地址库
目前有商用的IP地址库,还是些之前网上网盘中的一些IP库,有些大的公司会自建IP库,不过即使是同一家公司,也很有可能存在多个版本的IP库。
2.建立存储
有些IP库的格式如下
1 | xxx.xxx.xxx.0 中国 广东省 广州市 番禺区 中国联通 ... |
这种其实很好办,使用ip2long函数将其转为int,然后>>8位当key,value就是后面的具体信息,这样无论是用redis的kv还是mysql都可以满足需要。
我们知道IPV4有接近43亿个地址,可以分为1600万个C段地址,也就是数据量级为1600W,无论是哪种存储都是OK的。
另外一种IP库的格式如下
1 | xxx.xxx.xxx.0 xxx.xxx.xxx.255 中国 广东省 广州市 番禺区 中国联通 ... |
这种范围的格式不是很好用kv来解决了,有两种方法
2.1 利用mysql
将begin和end都用ip2long存起来,然后查询的时候用 ip > begin and ip < end 来提起,当然需要将begin、end做个联合索引。
2.2 利用Redis这样的kv
将begin作为KEY,然后存为KV,然后将ip2long(begin)存在有序集合中,这样通过两次查询依然可以找到。
上面都是IPV4的情况,IPV6的情况类似。不过貌似这些方法都不是很好,因为更新IP库的时候涉及到的变动挺多的。
3. 搭建服务
无论是http还是tcp/udp服务都可以,逻辑比较简单,就是简单的查询
4. 更新IP数据
这一步比较费,需要去调整2中的存储。