close
web2.0、云计算、集群、高可用性 web2.0、云计算、集群、高可用性
Search
基于BeansDB+纯真IP库的高性能IP转换系统

最近几个项目都用到了IP到城市转换功能。

之前,每个项目都是直接在纯真IP库里查。

可是现在数据量大了,越来越发现效率成问题了。

 

前一阵子看到豆瓣的开源项目BeansDB,当时直觉就告诉我,这东西非常有用。

抽空在测试机上搭建了一下,测试了一小把,感觉速度提高了很多。

立马把IP转换部分代码改成里基于BeansDB的。转换之后的架构如左图。

流程如下:

  1. 以IP为Key,在BeansDB中取值。
  2. 若第一步返回不为空,直接返回取回的值,流程结束。
  3. 若第一步返回为空,则以QQWry为Key,取回QQWry.Dat文件的二进制文件
  4. 按传统方法在第三步取回的QQWry.Dat二进制文件中查找IP对应地址信息
  5. 将第四步查找到的地址信息,以IP为Key,存进BeansDB中,并返回第四步查找的地址信息。

看着挺复杂,实际的代码改动非常之小。

  1. 继承原来IP转换类
  2. 重载初始化函数,以QQWry为Key在BeanDB中取值,若返回值不为空,则self.img置为返回值;若为空,将QQWry.Dat读到内存,以QQWry为Key,QQWry.Dat的二进制镜像为Value存到BeansDB中。
  3. 重载IP查找函数,按上面的逻辑处理IP查询。

 

从一个应用中依次取十万条记录,取五次,IP转换的耗时(不包括数据操作的时间)如下:

0:00:09.034996

0:00:07.834779

0:00:07.965700

0:00:08.016297

0:00:07.976602

另:写文章的同时,又做了一个100W的转换测试,结果:0:01:45.109918

BeansDB只有一台机器提供服务,跟应用跑在同一台机器上。

这个结果目前来说还是比较满意的,应该还有继续优化的空间

但这已证明了BeansDB性能还是非常可观的。

arrow5 Responses

  1. seacoastboy
    24 mos, 2 wks ago

    不错! 很好! 定时更新一下 更新一下 就更好了! QQWry好像 5天左右更新一次!
    如果 能放出代码 更方便交流了

  2. 24 mos, 2 wks ago

    你可以随时更新BeansDB中的QQWry
    我的代码是python写的。其它语言也很容易实现,技术上没有难度的说:)

  3. seacoastboy
    24 mos, 2 wks ago

    python的 也可以参考一下的! 

  4. 23 mos, 2 wks ago

    我现在需要分析ip的区域,看了你块的东西,但是还是不太明白如何使用,可以给我发一份例题吗,谢谢。如果可以的话,加我qq当面请教。1004118018

  5. 20 mos, 4 wks ago

    我现在需要分析ip的区域,看了你块的东西,但是还是不太明白如何使用,可以给我发一份例题吗,谢谢。如果可以的话,加我qq当面请教。1004118018
    +1

Leave A Comment