致力于打造中国站长娱乐学习的免费资源站!官方合作QQ:283852481

您当前的位置:首页 > 科技 > 传媒播报

招租联系QQ:283852481

一个千倍性能提升的IP-Location优化实践

时间:2017-01-12  来源:站长之家用户   

云智慧作为国内应用性能和端到端用户体验优化领域的专家,多年来一直致力研究、实践各种能够提升IT性能的新技术、新方法,最近在解决IP-Location查询算法优化的过程中,通过新的方法获得了1000倍的实际性能提升,第一时间分享给大家,希望能给云智慧的广大用户带来帮助。

    什么是IP-Location

    这里说的IP-Location是指:根据IP地址查询得到IP归属地的方法。查询方法有很多种,比如:查询第三方接口,查询本地数据库,使用网上的免费IP库等等。

    实现IP-Location查询过程中的四个实践

(1)最初是直接查询数据库得到IP信息的,这种方式的优点是逻辑简单,缺点是查询效率不高,特别是数据量大的时候,有可能导致数据库负载过高,甚至造成数据库不可用。这种方式做个demo是可以的,如果上生产却是不可行的。

(2)接着我们添加了本地缓存,每一个IP对应的归属地信息缓存到本地。有了本地缓存,对于后端数据库的压力就小了很多。一个IP只需要查询一次后端数据库,相同IP第二次查询就可以用缓存提供服务。这种方式的优点是减轻后端数据库压力,提高查询效率;缺点是随着IP量不断增大,缓存会不断膨胀,最终导致缓存查询效率急剧下降。

    cache结构是这样的:

    (3)下面对方法(2)进行改进:重新设计缓存的数据结构,以IP段为key,IP归属地为value。因为IP段是固定的,这样就解决了缓存数据量不断膨胀的问题。这种方法的优点是缓存数据量基本稳定,缺点是,在数据量不大的情况下,查询效率有所下降。

    这种方法为什么会导致查询效率的下降呢?相比第二种方法,查询一个IP无法直接精确定位到准确位置,需要先定位到一个大概位置,再进行遍历查询才能找到最终结果,而遍历查询导致了查询效率的降低。Cache数据结构如下:

    (4)为了解决第三种方案的缺点,我们又做了二级缓存。集合第二种和第三种方案的优点,IP段数据做二级缓存,精确IP做一级缓存,在一级缓存中做LRU算法剔除最近很少使用的IP,这样既解决了方案二数据膨胀的问题,又能有效避免方案三查询效率低的问题。

    这种方案似乎很高效很完美了,但是这种方案也有它的缺点:

    代码量大,查询后端数据库,查询缓存,一级缓存和二级缓存的同步,一级缓存的数据剔除算法等等;

    依赖重,依赖后端数据库和本地缓存,任何一个出问题,都会影响IP-Location的查询;

    IP信息更新不便,当有IP数据更新时,缓存中的数据需要全部删除,然后将后端数据库中的数据同步到各级缓存中。

    这些方案都或多或少的解决了实际应用中的一些问题,有的也达到了每秒千次查询的级别,但显然这还不是我们想要的最优方案。

    千倍性能提升的IP-Location优化实践

    本文的开始我们就说到了获得了“一个千倍性能提升的IP-Location优化实践”,上面的四种方法并不实现这个目标,而最终的方法是通过查询本地dat文件来实现IP-Location查询的。

    这种dat文件的方式优点有:

  文件体积小,只有2M的大小;

  查询速度快,100万/秒/核;

  数据更新方便,随时更新替换;

  API简单,一行代码即可搞定。

    那么通过dat文件是如何实现每秒百万次查询的呢?Dat文件是一个字节文件,我们把所有IP信息遵循一定的数据结构按照字节写进dat文件中,然后按照相同的数据结构查找,从而得到需要的IP数据信息。数据结构是这样的:

    数据共分四个区域:文件头,内容区,索引区,前缀区:

1)文件头,共16个字节,作用是定位索引区和前缀区的起始和结束的位置;

2)内容区,用于存放IP的归属地信息,比如:中国|北京|北京市|中国移动|;

3)索引区,顾名思义就是对IP进行索引的区域,这里是IP段的位置索引;

4)前缀区,前缀指的是IP的前缀,比如:221.176.18.56的前缀是221,前缀区是对索引区的索引。

    下面用一个IP查询场景来介绍IP-Location的过程,查询221.176.18.56的归属地:

(1)截取IP的前缀221;

(2)在文件头中找到前缀区的开始位置,然后定位到221在前缀区的位置;

(3)找出221对应的索引区start索引,索引区end索引;

(4)在文件头找到索引区的起始位置,根据第3步中221对应的索引区start索引,索引区end索引,定位到221在索引区的具体位置区间;

(5)根据二分法,找到221.176.18.56的具体索引位置,同时找出221.176.18.56的地区流位置和流长度;

(6)最后根据第5步中得到的221.176.18.56的信息,在内容区中找出IP对应的内容。

    这就是从dat文件中查找一个IP的详细过程,经过实际测算,dat文件的查询速度达到100万/秒,比缓存方式的查询性能提高了近千倍。对于这种高效的数据查询方式大家可以推而广之,在数据内容相对固定的场景、查询需求相对简单的情况下,都可以用这样的数据结构来存储,进而提升查询效率。


精彩广告