欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java獲取IP歸屬地全網(wǎng)顯示開(kāi)源庫(kù)使用

 更新時(shí)間:2022年07月14日 09:29:10   作者:ThinkingKeep  
這篇文章主要為大家介紹了java獲取IP歸屬地全網(wǎng)顯示的開(kāi)源庫(kù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

細(xì)心的朋友應(yīng)該會(huì)發(fā)現(xiàn),最近,繼新浪微博之后,頭條、騰訊、抖音、知乎、快手、小紅書(shū)等各大平臺(tái)陸陸續(xù)續(xù)都上線了“網(wǎng)絡(luò)用戶IP地址顯示功能”,境外用戶顯示的是國(guó)家,國(guó)內(nèi)的用戶顯示的省份,而且此項(xiàng)顯示無(wú)法關(guān)閉,歸屬地強(qiáng)制顯示。

作為技術(shù)人,那!這個(gè)功能要怎么實(shí)現(xiàn)呢?

Java如何獲取IP屬地

主要分為以下幾步:

  • 通過(guò) HttpServletRequest 對(duì)象,獲取用戶的 IP 地址
  • 通過(guò) IP 地址,獲取對(duì)應(yīng)的省份、城市

首先需要寫(xiě)一個(gè) IP 獲取的工具類(lèi),因?yàn)槊恳淮斡脩舻?Request 請(qǐng)求,都會(huì)攜帶上請(qǐng)求的 IP 地址放到請(qǐng)求頭中

通過(guò)此方法,從請(qǐng)求Header中獲取到用戶的IP地址

目前本人在做的項(xiàng)目中,也有獲取IP地址歸屬地省份、城市的需求,用的是:淘寶IP庫(kù)

地址:ip.taobao.com/

原來(lái)的請(qǐng)求源碼如下:

可以看到日志log文件中,大量的the request over max qps for user問(wèn)題

Ip2region開(kāi)源項(xiàng)目

Ip2region開(kāi)源項(xiàng)目,github地址:github.com/lionsoul201…

目前最新已更新到了v2.0版本,ip2region v2.0是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,準(zhǔn)提供了眾多主流編程語(yǔ)言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn)。

99.9%準(zhǔn)確率:

數(shù)據(jù)聚合了一些知名ip到地名查詢提供商的數(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ù), ip.taobao.com/\ 02, ≈10%, GeoIP, geoip.com/\ 03, ≈2%, 純真IP庫(kù), www.cz88.net/\ 備注:如果上述開(kāi)放API或者數(shù)據(jù)都不給開(kāi)放數(shù)據(jù)時(shí)ip2region將停止數(shù)據(jù)的更新服務(wù)。

多查詢客戶端的支持

已經(jīng)集成的客戶端有:java、C#、php、c、python、nodejs、php擴(kuò)展(php5和php7)、golang、rust、lua、lua_c, nginx。

binding描述開(kāi)發(fā)狀態(tài)binary查詢耗時(shí)b-tree查詢耗時(shí)memory查詢耗時(shí)
cANSC c binding已完成0.0x毫秒0.0x毫秒0.00x毫秒
c#c# binding已完成0.x毫秒0.x毫秒0.1x毫秒
golanggolang binding已完成0.x毫秒0.x毫秒0.1x毫秒
javajava binding已完成0.x毫秒0.x毫秒0.1x毫秒
lualua實(shí)現(xiàn)的binding已完成0.x毫秒0.x毫秒0.x毫秒
lua_clua的c擴(kuò)展已完成0.0x毫秒0.0x毫秒0.00x毫秒
nginxnginx的c擴(kuò)展已完成0.0x毫秒0.0x毫秒0.00x毫秒
nodejsnodejs已完成0.x毫秒0.x毫秒0.1x毫秒
phpphp實(shí)現(xiàn)的binding已完成0.x毫秒0.1x毫秒0.1x毫秒
php5_extphp5的c擴(kuò)展已完成0.0x毫秒0.0x毫秒0.00x毫秒
php7_extphp7的c擴(kuò)展已完成0.0毫秒0.0x毫秒0.00x毫秒
pythonpython bindng已完成0.x毫秒0.x毫秒0.x毫秒
rustrust binding已完成0.x毫秒0.x毫秒0.x毫秒

Ip2region V2.0 特性

1、標(biāo)準(zhǔn)化的數(shù)據(jù)格式

每個(gè) ip 數(shù)據(jù)段的 region 信息都固定了格式:國(guó)家|區(qū)域|省份|城市|ISP,只有中國(guó)的數(shù)據(jù)絕大部分精確到了城市,其他國(guó)家部分?jǐn)?shù)據(jù)只能定位到國(guó)家,后前的選項(xiàng)全部是0。

2、數(shù)據(jù)去重和壓縮

xdb 格式生成程序會(huì)自動(dòng)去重和壓縮部分?jǐn)?shù)據(jù),默認(rèn)的全部 IP 數(shù)據(jù),生成的 ip2region.xdb 數(shù)據(jù)庫(kù)是 11MiB,隨著數(shù)據(jù)的詳細(xì)度增加數(shù)據(jù)庫(kù)的大小也慢慢增大。

3、極速查詢響應(yīng)

即使是完全基于 xdb 文件的查詢,單次查詢響應(yīng)時(shí)間在十微秒級(jí)別,可通過(guò)如下兩種方式開(kāi)啟內(nèi)存加速查詢:

  • vIndex 索引緩存 :使用固定的 512KiB 的內(nèi)存空間緩存 vector index 數(shù)據(jù),減少一次 IO 磁盤(pán)操作,保持平均查詢效率穩(wěn)定在10-20微秒之間。
  • xdb 整個(gè)文件緩存:將整個(gè) xdb 文件全部加載到內(nèi)存,內(nèi)存占用等同于 xdb 文件大小,無(wú)磁盤(pán) IO 操作,保持微秒級(jí)別的查詢效率。

4、極速查詢響應(yīng)

v2.0 格式的 xdb 支持億級(jí)別的 IP 數(shù)據(jù)段行數(shù),region 信息也可以完全自定義,例如:你可以在 region 中追加特定業(yè)務(wù)需求的數(shù)據(jù),例如:GPS信息/國(guó)際統(tǒng)一地域信息編碼/郵編等。也就是你完全可以使用 ip2region 來(lái)管理你自己的 IP 定位數(shù)據(jù)。

ip2region xdb java 查詢客戶端實(shí)現(xiàn)

  • 使用方式

引入maven倉(cāng)庫(kù):

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>2.6.4</version>
</dependency>
  • 完全基于文件的查詢
import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;
public class SearcherTest {
    public static void main(String[] args) {
        // 1、創(chuàng)建 searcher 對(duì)象
        String dbPath = "ip2region.xdb file path";
        Searcher searcher = null;
        try {
            searcher = Searcher.newWithFileOnly(dbPath);
        } catch (IOException e) {
            System.out.printf("failed to create searcher with `%s`: %s\n", dbPath, e);
            return;
        }
        // 2、查詢
        try {
            String ip = "1.2.3.4";
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
            System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
        } catch (Exception e) {
            System.out.printf("failed to search(%s): %s\n", ip, e);
        }
        // 3、備注:并發(fā)使用,每個(gè)線程需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的 searcher 對(duì)象單獨(dú)使用。
    }
}
  • 緩存VectorIndex索引

我們可以提前從 xdb 文件中加載出來(lái) VectorIndex 數(shù)據(jù),然后全局緩存,每次創(chuàng)建 Searcher 對(duì)象的時(shí)候使用全局的 VectorIndex 緩存可以減少一次固定的 IO 操作,從而加速查詢,減少 IO 壓力。

import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;
public class SearcherTest {
    public static void main(String[] args) {
        String dbPath = "ip2region.xdb file path";
        // 1、從 dbPath 中預(yù)先加載 VectorIndex 緩存,并且把這個(gè)得到的數(shù)據(jù)作為全局變量,后續(xù)反復(fù)使用。
        byte[] vIndex;
        try {
            vIndex = Searcher.loadVectorIndexFromFile(dbPath);
        } catch (Exception e) {
            System.out.printf("failed to load vector index from `%s`: %s\n", dbPath, e);
            return;
        }
        // 2、使用全局的 vIndex 創(chuàng)建帶 VectorIndex 緩存的查詢對(duì)象。
        Searcher searcher;
        try {
            searcher = Searcher.newWithVectorIndex(dbPath, vIndex);
        } catch (Exception e) {
            System.out.printf("failed to create vectorIndex cached searcher with `%s`: %s\n", dbPath, e);
            return;
        }
        // 3、查詢
        try {
            String ip = "1.2.3.4";
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
            System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
        } catch (Exception e) {
            System.out.printf("failed to search(%s): %s\n", ip, e);
        }
        // 備注:每個(gè)線程需要單獨(dú)創(chuàng)建一個(gè)獨(dú)立的 Searcher 對(duì)象,但是都共享全局的制度 vIndex 緩存。
    }
}
  • 緩存整個(gè)xdb數(shù)據(jù)

我們也可以預(yù)先加載整個(gè) ip2region.xdb 的數(shù)據(jù)到內(nèi)存,然后基于這個(gè)數(shù)據(jù)創(chuàng)建查詢對(duì)象來(lái)實(shí)現(xiàn)完全基于文件的查詢,類(lèi)似之前的 memory search。

import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;
public class SearcherTest {
    public static void main(String[] args) {
        String dbPath = "ip2region.xdb file path";
        // 1、從 dbPath 加載整個(gè) xdb 到內(nèi)存。
        byte[] cBuff;
        try {
            cBuff = Searcher.loadContentFromFile(dbPath);
        } catch (Exception e) {
            System.out.printf("failed to load content from `%s`: %s\n", dbPath, e);
            return;
        }
        // 2、使用上述的 cBuff 創(chuàng)建一個(gè)完全基于內(nèi)存的查詢對(duì)象。
        Searcher searcher;
        try {
            searcher = Searcher.newWithBuffer(cBuff);
        } catch (Exception e) {
            System.out.printf("failed to create content cached searcher: %s\n", e);
            return;
        }
        // 3、查詢
        try {
            String ip = "1.2.3.4";
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
            System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
        } catch (Exception e) {
            System.out.printf("failed to search(%s): %s\n", ip, e);
        }
        // 備注:并發(fā)使用,用整個(gè) xdb 數(shù)據(jù)緩存創(chuàng)建的查詢對(duì)象可以安全的用于并發(fā),也就是你可以把這個(gè) searcher 對(duì)象做成全局對(duì)象去跨線程訪問(wèn)。
    }
}

IDEA中做個(gè)測(cè)試

完全基于文件的查詢

ip屬地國(guó)內(nèi)的話,會(huì)展示省份,國(guó)外的話,只會(huì)展示國(guó)家??梢酝ㄟ^(guò)如下圖這個(gè)方法進(jìn)行進(jìn)一步封裝,得到獲取IP屬地的信息。

下面是官網(wǎng)給出的命令運(yùn)行jar方式給出的測(cè)試demo,可以理解下

編譯測(cè)試程序

通過(guò) maven 來(lái)編譯測(cè)試程序。

# cd 到 java binding 的根目錄
cd binding/java/
mvn compile package

然后會(huì)在當(dāng)前目錄的 target 目錄下得到一個(gè) ip2region-{version}.jar 的打包文件。

查詢測(cè)試

可以通過(guò) java -jar ip2region-{version}.jar search 命令來(lái)測(cè)試查詢:

?  java git:(v2.0_xdb) ? java -jar target/ip2region-2.6.0.jar search
java -jar ip2region-{version}.jar search [command options]
options:
 --db string              ip2region binary xdb file path
 --cache-policy string    cache policy: file/vectorIndex/content

例如:使用默認(rèn)的 data/ip2region.xdb 文件進(jìn)行查詢測(cè)試:

?  java git:(v2.0_xdb) ? java -jar target/ip2region-2.6.0.jar search --db=../../data/ip2region.xdb
ip2region xdb searcher test program, cachePolicy: vectorIndex
type 'quit' to exit
ip2region>> 1.2.3.4
{region: 美國(guó)|0|華盛頓|0|谷歌, ioCount: 7, took: 82 μs}
ip2region>>

輸入 ip 即可進(jìn)行查詢測(cè)試,也可以分別設(shè)置 cache-policy 為 file/vectorIndex/content 來(lái)測(cè)試三種不同緩存實(shí)現(xiàn)的查詢效果。

bench 測(cè)試

可以通過(guò) java -jar ip2region-{version}.jar bench 命令來(lái)進(jìn)行 bench 測(cè)試,一方面確保 xdb 文件沒(méi)有錯(cuò)誤,一方面可以評(píng)估查詢性能:

?  java git:(v2.0_xdb) ? java -jar target/ip2region-2.6.0.jar bench
java -jar ip2region-{version}.jar bench [command options]
options:
 --db string              ip2region binary xdb file path
 --src string             source ip text file path
 --cache-policy string    cache policy: file/vectorIndex/content

例如:通過(guò)默認(rèn)的 data/ip2region.xdb 和 data/ip.merge.txt 文件進(jìn)行 bench 測(cè)試:

?  java git:(v2.0_xdb) ? java -jar target/ip2region-2.6.0.jar bench --db=../../data/ip2region.xdb --src=../../data/ip.merge.txt
Bench finished, {cachePolicy: vectorIndex, total: 3417955, took: 8s, cost: 2 μs/op}

可以通過(guò)分別設(shè)置 cache-policy 為 file/vectorIndex/content 來(lái)測(cè)試三種不同緩存實(shí)現(xiàn)的效果。 @Note: 注意 bench 使用的 src 文件要是生成對(duì)應(yīng) xdb 文件相同的源文件。

到這里獲取用戶IP屬地已經(jīng)完成啦,這篇文章介紹的v2.0版本,有興趣的小伙伴可以登錄上門(mén)的github地址了解下v1.0版本

更多關(guān)于java獲取IP歸屬地全網(wǎng)顯示的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MybatisPlus查詢數(shù)據(jù)日期格式化問(wèn)題解決方法

    MybatisPlus查詢數(shù)據(jù)日期格式化問(wèn)題解決方法

    MyBatisPlus是MyBatis的增強(qiáng)工具,支持常規(guī)的CRUD操作以及復(fù)雜的聯(lián)表查詢等功能,這篇文章主要給大家介紹了關(guān)于MybatisPlus查詢數(shù)據(jù)日期格式化問(wèn)題的解決方法,需要的朋友可以參考下
    2023-10-10
  • java讀取簡(jiǎn)單excel通用工具類(lèi)

    java讀取簡(jiǎn)單excel通用工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了java讀取簡(jiǎn)單excel通用工具類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 淺析如何在Java應(yīng)用中優(yōu)雅的發(fā)送短信

    淺析如何在Java應(yīng)用中優(yōu)雅的發(fā)送短信

    很多業(yè)務(wù)場(chǎng)景里,我們都需要發(fā)送短信,比如登陸驗(yàn)證碼、告警、營(yíng)銷(xiāo)通知、節(jié)日祝福等等,這篇文章,我們聊聊 Java 應(yīng)用中如何優(yōu)雅的發(fā)送短信,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • Java中如何獲取文件的上級(jí)目錄

    Java中如何獲取文件的上級(jí)目錄

    這篇文章主要介紹了Java中如何獲取文件的上級(jí)目錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java--裝箱和拆箱詳解

    Java--裝箱和拆箱詳解

    本篇文章主要介紹了詳解Java 自動(dòng)裝箱與拆箱的實(shí)現(xiàn)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07
  • MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    大家都知道Hibernate 是全自動(dòng)的數(shù)據(jù)庫(kù)持久層框架,它可以通過(guò)實(shí)體來(lái)映射數(shù)據(jù)庫(kù),通過(guò)設(shè)置一對(duì)多、多對(duì)一、一對(duì)一、多對(duì)多的關(guān)聯(lián)來(lái)實(shí)現(xiàn)聯(lián)合查詢,接下來(lái)通過(guò)本文給大家介紹MyBatis?多表聯(lián)合查詢及優(yōu)化,需要的朋友可以參考下
    2022-08-08
  • SpringBoot整合JavaMail實(shí)現(xiàn)發(fā)郵件的項(xiàng)目實(shí)踐

    SpringBoot整合JavaMail實(shí)現(xiàn)發(fā)郵件的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot整合JavaMail實(shí)現(xiàn)發(fā)郵件的項(xiàng)目實(shí)踐,詳細(xì)闡述了使用SpringBoot和JavaMail發(fā)送郵件的步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例

    java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例

    這篇文章主要介紹了java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Android開(kāi)發(fā)簡(jiǎn)單計(jì)算器實(shí)現(xiàn)代碼

    Android開(kāi)發(fā)簡(jiǎn)單計(jì)算器實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android開(kāi)發(fā)簡(jiǎn)單計(jì)算器實(shí)現(xiàn),本文放置了完整的Android開(kāi)發(fā)電腦,通過(guò)部署項(xiàng)目可以直接按到效果,希望本篇文章可以對(duì)你有所幫助
    2021-06-06
  • Java并發(fā)包之CopyOnWriteArrayList類(lèi)的深入講解

    Java并發(fā)包之CopyOnWriteArrayList類(lèi)的深入講解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)包之CopyOnWriteArrayList類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論