一個(gè)還不錯(cuò)的離線 IP 地址定位庫(kù),99.9% 準(zhǔn)確率!
來(lái)源:gitee.com/lionsoul/ip2region
Ip2region特性 ip2region快速測(cè)試 ip2region安裝 ip2region 并發(fā)使用 ip2region.db的生成
ip2region - 準(zhǔn)確率99.9%的離線IP地址定位庫(kù),0.0x毫秒級(jí)查詢(xún),ip2region.db數(shù)據(jù)庫(kù)只有數(shù)MB,提供了java,php,c,python,nodejs,golang,c#等查詢(xún)綁定和Binary,B樹(shù),內(nèi)存三種查詢(xún)算法。
Ip2region特性
99.9%準(zhǔn)確率
數(shù)據(jù)聚合了一些知名ip到地名查詢(xún)提供商的數(shù)據(jù),這些是他們官方的的準(zhǔn)確率,經(jīng)測(cè)試著實(shí)比經(jīng)典的純真IP定位準(zhǔn)確一些。ip2region的數(shù)據(jù)聚合自以下服務(wù)商的開(kāi)放API或者數(shù)據(jù)(升級(jí)程序每秒請(qǐng)求次數(shù)2到4次): 01, >80%, 淘寶IP地址庫(kù), http://ip.taobao.com/ 02, ≈10%, GeoIP, https://geoip.com/ 03, ≈2%, 純真IP庫(kù), http://www.cz88.net/ **備注:**如果上述開(kāi)放API或者數(shù)據(jù)都不給開(kāi)放數(shù)據(jù)時(shí)ip2region將停止數(shù)據(jù)的更新服務(wù)。
標(biāo)準(zhǔn)化的數(shù)據(jù)格式
每條ip數(shù)據(jù)段都固定了格式:
_城市Id|國(guó)家|區(qū)域|省份|城市|ISP_
只有中國(guó)的數(shù)據(jù)精確到了城市,其他國(guó)家有部分?jǐn)?shù)據(jù)只能定位到國(guó)家,后前的選項(xiàng)全部是0,已經(jīng)包含了全部你能查到的大大小小的國(guó)家(請(qǐng)忽略前面的城市Id,個(gè)人項(xiàng)目需求)。
體積小
包含了全部的IP,生成的數(shù)據(jù)庫(kù)文件ip2region.db只有幾MB,最小的版本只有1.5MB,隨著數(shù)據(jù)的詳細(xì)度增加數(shù)據(jù)庫(kù)的大小也慢慢增大,目前還沒(méi)超過(guò)8MB。
查詢(xún)速度快
全部的查詢(xún)客戶(hù)端單次查詢(xún)都在0.x毫秒級(jí)別,內(nèi)置了三種查詢(xún)算法
memory算法:整個(gè)數(shù)據(jù)庫(kù)全部載入內(nèi)存,單次查詢(xún)都在0.1x毫秒內(nèi),C語(yǔ)言的客戶(hù)端單次查詢(xún)?cè)?.00x毫秒級(jí)別。 binary算法:基于二分查找,基于ip2region.db文件,不需要載入內(nèi)存,單次查詢(xún)?cè)?.x毫秒級(jí)別。 b-tree算法:基于btree算法,基于ip2region.db文件,不需要載入內(nèi)存,單詞查詢(xún)?cè)?.x毫秒級(jí)別,比binary算法更快。
任何客戶(hù)端b-tree都比binary算法快,當(dāng)然memory算法固然是最快的!
多查詢(xún)客戶(hù)端的支持
已經(jīng)集成的客戶(hù)端有:java、C#、php、c、python、nodejs、php擴(kuò)展(php5和php7)、golang、rust、lua、lua_c, nginx。
| binding | 描述 | 開(kāi)發(fā)狀態(tài) | binary查詢(xún)耗時(shí) | b-tree查詢(xún)耗時(shí) | memory查詢(xún)耗時(shí) |
|---|---|---|---|---|---|
| c | ANSC c binding | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
| c# | c# binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
| golang | golang binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
| java | java binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
| lua | lua實(shí)現(xiàn)的binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒 |
| lua_c | lua的c擴(kuò)展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
| nginx | nginx的c擴(kuò)展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
| nodejs | nodejs | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
| php | php實(shí)現(xiàn)的binding | 已完成 | 0.x毫秒 | 0.1x毫秒 | 0.1x毫秒 |
| php5_ext | php5的c擴(kuò)展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
| php7_ext | php7的c擴(kuò)展 | 已完成 | 0.0毫秒 | 0.0x毫秒 | 0.00x毫秒 |
| python | python bindng | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒 |
| rust | rust binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒 |
ip2region快速測(cè)試
請(qǐng)參考每個(gè)binding下的README說(shuō)明去運(yùn)行cli測(cè)試程序,例如C語(yǔ)言的demo運(yùn)行如下:
cd?binding/c/
gcc?-g?-O2?testSearcher.c?ip2region.c
./a.out?../../data/ip2region.db
會(huì)看到如下cli界面:
initializing??B-tree?...
+----------------------------------+
|?ip2region?test?script????????????|
|?Author:?chenxin619315@gmail.com??|
|?Type?'quit'?to?exit?program??????|
+----------------------------------+
p2region>>?101.105.35.57
2163|中國(guó)|華南|廣東省|深圳市|鵬博士?in?0.02295?millseconds
輸入IP地址開(kāi)始測(cè)試,第一次會(huì)稍微有點(diǎn)慢,在運(yùn)行命令后面接入binary,memory來(lái)嘗試其他算法,建議使用b-tree算法,速度和并發(fā)需求的可以使用memory算法,具體集成請(qǐng)參考不同binding下的測(cè)試源碼。
ip2region安裝
具體請(qǐng)參考每個(gè)binding下的README文檔和測(cè)試demo,以下是一些可用的快捷安裝方式:
maven倉(cāng)庫(kù)地址
????org.lionsoul
????ip2region
????1.7.2
nodejs
npm?install?node-ip2region?--save
nuget安裝
Install-Package?IP2Region
php composer
#?插件來(lái)自:https://github.com/zoujingli/ip2region
composer?require?zoujingli/ip2region
ip2region 并發(fā)使用
全部binding的各個(gè)search接口都不是線程安全的實(shí)現(xiàn),不同線程可以通過(guò)創(chuàng)建不同的查詢(xún)對(duì)象來(lái)使用,并發(fā)量很大的情況下,binary和b-tree算法可能會(huì)打開(kāi)文件數(shù)過(guò)多的錯(cuò)誤,請(qǐng)修改內(nèi)核的最大允許打開(kāi)文件數(shù)(fs.file-max=一個(gè)更高的值),或者使用持久化的memory算法。 memorySearch接口,在發(fā)布對(duì)象前進(jìn)行一次預(yù)查詢(xún)(本質(zhì)上是把ip2region.db文件加載到內(nèi)存),可以安全用于多線程環(huán)境。
ip2region.db的生成
從1.8版本開(kāi)始,ip2region開(kāi)源了ip2region.db生成程序的java實(shí)現(xiàn),提供了ant編譯支持,編譯后會(huì)得到以下提到的dbMaker-{version}.jar,對(duì)于需要研究生成程序的或者更改自定義生成配置的請(qǐng)參考${ip2region_root}/maker/java內(nèi)的java源碼。
從ip2region 1.2.2版本開(kāi)始里面提交了一個(gè)dbMaker-{version}.jar的可以執(zhí)行jar文件,用它來(lái)完成這個(gè)工作:
確保你安裝好了java環(huán)境(不玩Java的童鞋就自己谷歌找找拉,臨時(shí)用一用,幾分鐘的事情) cd到${ip2region_root}/maker/java,然后運(yùn)行如下命令:
java?-jar?dbMaker-{version}.jar?-src?文本數(shù)據(jù)文件?-region?地域csv文件?[-dst?生成的ip2region.db文件的目錄](méi)
#?文本數(shù)據(jù)文件:db文件的原始文本數(shù)據(jù)文件路徑,自帶的ip2region.db文件就是/data/ip.merge.txt生成而來(lái)的,你可以換成自己的或者更改/data/ip.merge.txt重新生成
#?地域csv文件:該文件目的是方便配置ip2region進(jìn)行數(shù)據(jù)關(guān)系的存儲(chǔ),得到的數(shù)據(jù)包含一個(gè)city_id,這個(gè)直接使用/data/origin/global_region.csv文件即可
# ip2region.db文件的目錄:是可選參數(shù),沒(méi)有指定的話會(huì)在當(dāng)前目錄生成一份./data/ip2region.db文件
