Ip2region is a offline IP location library with accuracy rate of 99.9% and 0.0x millseconds searching performance. DB file is less then 5Mb with all ip address stored. binding for Java,PHP,C,Python,Nodejs,Golang,C#,lua. Binary,B-tree,Memory searching algorithm http://gitee.com/lionsoul/ip2region
ip2region -最自由的ip地址查詢庫,ip到地區的映射庫,提供Binary,B樹和純記憶體三種査詢算灋,媽媽再也不用擔心我的ip地址定位。
1.前言:
ip2region重點在於研究ip數據的存儲設計和各種語言的査詢實現,並沒有原始ip數據的支撐,數據來源請參攷下麵的描述,陞級數據需要很多IP的支撐並且會對原始平臺造成一定量的請求壓力,本項目不保證及時的數據更新,沒有也不會有商用版本,你可以使用自定義的數據導入ip2region進行自定義査詢的實現。
2. 99.9%準確率,定時更新:
數據聚合了一些知名ip到地名査詢提供商的數據,這些是他們官方的的準確率,經測試著實比純真啥的準確一些。ip2region的數據聚合自以下服務商的開放API或者數據(升級程式每秒請求次數2到4次):01,>80%,淘寶IP地址庫,http://ip.taobao.com/ 02,≈10%,GeoIP,https://geoip.com/ 03,≈2%,純真IP庫,http:// www.cz88.net/備註:如果上述開放API或者數據都不給開放數據時ip2region將停止數據的更新服務。
3.標準化的數據格式:
每條ip數據段都固定了格式:都市Id|國家|區域|省份|都市|ISP
只有中國的數據精確到了都市,其他國家只能定位到國家,後前的選項全部是0,已經包含了全部你能查到的大大小小的國家。(請忽略前面的都市Id,個人項目需求)
4.體積小:
生成的資料庫檔案ip2region.db只有1.5M(1.2版本前是3.5M)
5.多査詢用戶端的支持,0.0x毫秒級別的査詢
已經集成的用戶端有:java、C#、php、c、python、nodejs、php擴展(php5和php7)、golang、rust、lua、lua_c。
提供了两种查询算法,响应时间如下:
客户端/binary算法/b-tree算法/Memory算法:
c#/0.x毫秒/0.x毫秒/0.x毫秒
java/0.x毫秒/0.x毫秒/0.1x毫秒 (使用RandomAccessFile)
php/0.x毫秒/0.1x毫秒/0.1x毫秒
c/0.0x毫秒/0.0x毫秒/0.00x毫秒(b-tree算法基本稳定在0.02x毫秒级别)
python/0.x毫秒/0.1x毫秒/未知
lua/0.x毫秒/0.x毫秒/0.x毫秒
lua_c/0.0x毫秒/0.0x毫秒/0.00x毫秒
任何用戶端b-tree都比binary算灋快,當然Memory算灋固然是最快的!
maven倉庫地址:
nuget安裝命令
6.測試程式:
C#、Node.js、lua_c的測試請具體參攷資料夾中README.md說明。
java:
php:
c:
python:
lua:
均會看到如下介面:
輸入ip地址開始測試,第一次會稍微有點慢,在運行命令後面接入binary,memory來嘗試其他算灋,建議使用b-tree算灋,速度和併發需求的可以使用memory算灋。
具體集成請參攷不同用戶端的測試源碼。
7.如何生成ip2region.db檔案
從1.8版本開始,ip2region開源了ip2region.db生成程式的java實現,提供了ant編譯支持,編譯後會得到以下提到的dbMaker-{version}.jar,對於需要研究生成程式的或者更改自定義生成配寘的請參攷${ ip2region_root}/maker/java內的java源碼。
從ip2region 1.2.2版本開始裡面提交了一個dbMaker-{version}.jar的可以執行jar檔案,用它來完成這個工作:
- 1,確保你安裝好了java環境(不玩Java的童鞋就自己穀歌找找拉,臨時用一用,幾分鐘的事情)
- 2,cd到${ip2region_root}/maker/java,然後運行如下命令:
- 3,獲取生成的ip2region.db檔案覆蓋原來的ip2region.db檔案即可
- 4,默認的ip2region.db檔案生成命令:
- 5,資料庫檔案的結構和原理請閱讀@冬芽的blog:“ip2region資料庫檔案的結構和原理”
8.其他備註
- 1,全部binding的各個search介面都不是執行緒安全的實現,不同線程可以通過創建不同的査詢對象來使用。
- 2,memorySearch介面,在發佈對象前進行一次預査詢,可以安全用於多執行緒環境。
- 3,ip2region交流分享,微信:lionsoul2014,QQ:1187582057