今天在做公司裂变系统时,需要对每一个扫码进来的用户进行IP地址查询,考虑到裂变项目的高并发特点,考虑用node.js来实现这个接口,我的想法是先找一下网上有没有类似的插件,有的话先拿来解决问题,没有就自己写一个,后面还真找到了,lib-qqwry就是专业干这个的,一起来了解一下。
lib-qqwry是一个高效查询纯真 IP 库(qqwry.dat)的模块。它是用 NodeJS 解析纯真 IP 库(QQwry.dat) ,支持 IP 段查询。为了更好的字符转化效率,未使用iconv模块,直接使用gbk编码表文件。经过不断优化,相同环境下,单次查询速度从最初的0.6毫秒提升到现在的0.004毫秒。
就凭这查询速度完全就是为我准备的啊,哈哈哈!
它能干些啥?
1. 通过IP地址或有效的IP数值,搜索IP地址对应的地理位置信息。
2. 搜索一个IP段的地理位置信息。
3. IP地址与数值的互转。
如何安装?
npm install lib-qqwry
如何使用?
1. 引入并初始化,普通机器初始70毫秒左右
var qqwry = require('lib-qqwry').info();
2. 查询IP信息
qqwry.searchIP("202.103.102.10");
3. 查询IP段信息
qqwry.searchIPScope("0.0.0.0","1.0.0.0");
静态方法有哪些?
1. IP库初始化
info(dataPath)
dataPath IP库路径,可选,默认路径为data文件夹中(__dirname + "/data/qqwry.dat");
2. IP库初始化的异步方法
infoAsync(dataPath,callback)
dataPath IP库路径,可选,默认路径为data文件夹中(__dirname + "/data/qqwry.dat");
callback 回调函数 ,可在此时调用查询函数
3. 释放初始化后占用的资源
unInfo()
4. 单个IP查询
searchIP(IP)
IP地址/IP数值 返回一个JSON对像
5. IP段查询
searchIPScope(beginIP,endIP)
beginIP为开始IP,endIP为结束IP
6. IP段查询的异步方法
searchIPScopeAsync(beginIP,endIP,callback)
beginIP为开始IP,endIP为结束IP,callback 回调函数,查询结果会以第一个参数的形式传给回调函数
7. 调试模式开关,默认未启用
DBUG(Bool)
DUBG模式会在控制台输出查询的关键信息,方便定位错误
require('lib-qqwry').DBUG().info()
开启调试模式并初始化
qqrry.DBUG(false)
关闭调试模式
8. IP地址转数值 (静态方法,无需初始化,可直接使用)
ipToInt(IP)
qqwry.ipToInt("255.255.255.255")
输出 429496729
9. 数值转IP地址( 静态方法 )
intToIP(INT)
qqwry.intToIP(4294967295)
输出 '255.255.255.255'
10. 字节序转换 (静态方法)
ipEndianChange(INT)
按32位转换参数的字节序,一些云平台的环境变量中IP信息可能是Little-Endian形式的数值,如百度node.js环境中的 process.env.BAE_ENV_COOKIE_IP , 这时候可以派上用场
qqwry.ipEndianChange(0x010000FF)
输出 4278190081 // 0xFF000001
最后一起来看一下这段代码的最终实现,代码挺简单的
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5CNsJTOpl2by0GNvwlMxkjM5kzNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)