一個還不錯的離線 IP 地址定位庫,99.9% 準確率!

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

