當前位置: 妍妍網 > 碼農

透過 ip 查詢歸屬地,要小心了!

2024-04-03碼農

戳下方名片 ,關註並 星標

回復「 1024 」獲取 2TB 學習資源!

👉 體系化學習:

特色專欄

/ /

/ /

/ /

/ /

/ /

大家好,我是民工哥!

透過ip查詢歸屬地,要小心了!

背景

最近公司做了一些行銷活動,投入資金進行了流量推廣,pv、UV都做了統計。老板說,我要看下使用者的區域分布的數據。

以前的文章我講過,pv、UV如何統計?我們是基於ip進行統計的。用的ip能獲取到,那透過ip查詢歸屬地就ok了。

思維擴充套件下,ip 查詢歸屬地的的場景還蠻多的,我列舉一些:

場景

  • 網路安全調查 :當發生網路攻擊或惡意行為時,透過查詢IP地址的歸屬地可以幫助調查人員追蹤攻擊者的位置和身份,進而采取相應的應對措施。

  • 電商網站反欺詐 :電商平台可以透過查詢IP的歸屬地來檢測是否有異常行為,如異地登入或使用虛假身份資訊下單,從而防止欺詐行為發生。

  • 廣告定向投放 :在線上廣告市場中,根據使用者所在地區進行IP歸屬地查詢可以幫助廣告主精準定位目標受眾,提高廣告投放效果和ROI。

  • 地理位置服務 :地圖套用、天氣預報和周邊生活服務等可以利用IP歸屬地查詢來確定使用者的大概地理位置,提供個人化的地理服務和資訊。

  • 網站流量分析 :網站管理員可以利用IP歸屬地查詢來分析網站存取的地域分布情況,評估市場覆蓋範圍,制定針對性的行銷策略和內容最佳化計劃。

  • 這些具體的使用場景說明了IP歸屬地查詢在網路安全、行銷推廣、個人化服務等方面的重要作用,能夠幫助使用者更好地理解使用者行為和最佳化業務流程。

    谷歌搜尋了下,第三方提供的ip查詢歸屬地服務,挺多的,但是收費、收費、收費!!! 免費也有些,但是怕不穩定。

    無意間找到了ip2region這個計畫,一直持續維護更新,試用後,效果杠桿的。那我們怎麽用的,繼續往下看。

    ip2region

    Ip2region 是什麽

    ip2region - 是一個離線IP地址定位庫和IP定位數據管理框架,10微秒級別的查詢效率,提供了眾內送流量備援容錯機制流程式語言的 xdb 數據生成和查詢客戶端實作。

    Ip2region 特性

    IP 數據管理框架

    xdb 支持億級別的 IP 數據段行數,預設的 region 資訊都固定了格式:國家|區域|省份|城市|ISP,缺省的地域資訊預設是0。region 資訊支持完全自訂,例如:你可以在 region 中追加特定業務需求的數據,例如:GPS資訊/國際統一地域資訊編碼/郵編等。也就是你完全可以使用 ip2region 來管理你自己的 IP 定位數據。

    數據去重和壓縮

    xdb 格式生成程式會自動去重和壓縮部份數據,預設的全部 IP 數據,生成的 ip2region.xdb 資料庫是 11MiB,隨著數據的詳細度增加資料庫的大小也慢慢增大。

    極速查詢響應

    即使是完全基於 xdb 檔的查詢,單次查詢響應時間在十微秒級別,可透過如下兩種方式開啟記憶體加速查詢:

  • vIndex 索引緩存 :使用固定的 512KiB 的記憶體空間緩存 vector index 數據,減少一次 IO 磁盤操作,保持平均查詢效率穩定在10-20微秒之間。

  • xdb 整個檔緩存:將整個 xdb 檔全部載入到記憶體,記憶體占用等同於 xdb 檔大小,無磁盤 IO 操作,保持微秒級別的查詢效率。

  • Ip2region 支持那些語言

    Ip2region大部份主流語言都支持,支持的語言如下:

    Ip2region怎麽用

    在這裏,我以golang語言作為演示,其他語言,可以看下官方文件。

    例子:我需要查詢ip為:218.63.140.248 的歸屬地

    下載ip2region.xdb包

    存取ip2region 計畫,ip的庫檔在data目錄下,點選下載即可

    package 獲取

    go get github.com/lionsoul2014/ip2region/binding/golang

    完全基於檔的查詢

    package main
    import (
    "fmt"
    "github.com/lionsoul2014/ip2region/binding/golang/xdb"
    "time"
    )
    func main() {
     //dbPath寫入你下載的ip2region.xdb檔的路徑,我這裏放在了當前目錄下
     var dbPath = "ip2region.xdb"
     searcher, err := xdb.NewWithFileOnly(dbPath)
    if err != nil {
    fmt.Printf("failed to create searcher: %s\n", err.Error())
    return
     }
     defer searcher.Close()
     // 查詢218.63.140.248對應的地址
     var ip = "218.63.140.248"
     var tStart = time.Now()
     region, err := searcher.SearchByStr(ip)
    if err != nil {
    fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)
    return
     }
     fmt.Printf("{region: %s, took: %s}\n", region, time.Since(tStart))
     // 備註:並行使用,每個 goroutine 需要建立一個獨立的 searcher 物件。
    }

    查詢結果

    此ip的歸屬地為:中國雲南省昆明市電信

    緩存整個 xdb 數據

    可以預先載入整個 ip2region.xdb 到記憶體,完全基於記憶體查詢,類似於之前的 memory search 查詢。

    package main
    import (
    "fmt"
    "github.com/lionsoul2014/ip2region/binding/golang/xdb"
    "time"
    )
    func main() {
     //dbPath寫入你下載的ip2region.xdb檔的路徑,我這裏放在了當前目錄下
     var dbPath = "ip2region.xdb"
     // 1、從 dbPath 載入整個 xdb 到記憶體
     cBuff, err := xdb.LoadContentFromFile(dbPath)
    if err != nil {
    fmt.Printf("failed to load content from `%s`: %s\n", dbPath, err)
    return
     }
     // 2、用全域的 cBuff 建立完全基於記憶體的查詢物件。
     searcher, err := xdb.NewWithBuffer(cBuff)
    if err != nil {
    fmt.Printf("failed to create searcher with vector index: %s\n", err)
    return
     }
     defer searcher.Close()
     // 查詢218.63.140.248對應的地址
     var ip = "218.63.140.248"
     var tStart = time.Now()
     region, err := searcher.SearchByStr(ip)
    if err != nil {
    fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)
    return
     }
     fmt.Printf("{region: %s, took: %s}\n", region, time.Since(tStart))
     // 備註:並行使用,每個 goroutine 需要建立一個獨立的 searcher 物件。
    }

    查詢結果:

    方案比對
  • 基於檔的查詢,響應時間:38us

  • 基於緩存的查詢,響應時間:10.29µs

  • 生成環境使用建議使用方式為:基於緩存的查詢

    生產如何使用

    以上的演示,只是個demo,如果要放線上上如何使用呢?

  • 以sdk的形式嵌入到計畫,使用基於緩存的查詢方式。

  • ip查詢的場景很多,可以單獨構建一個ip查詢的公共服務,提高給各個業務線使用

  • sdk接入的方式,用到的業務線都需要對接一次,ip2region.xdb如果有更新,所有用到的計畫都要自己去更新升級db檔,維護成本太高。如果你的計畫比較單一,sdk接入也是不錯的。

    我們的方案:因為我業務線相對太多,如果各個業務線自己接,維護的成本太高。我們決定構建IP查詢歸屬地公共服務,往外提供查詢的能力。後續服務的升級、維護等,統一在公共服務裏面來做。

    作者:柯柏技術筆記 連結:

    juejin.cn/post/7340950101534982179

    公眾號讀者專屬技術群

    構建高品質的技術交流社群,歡迎從事後端開發、運維技術進群( 備註崗位,已在技術交流群的請勿重復添加微信好友 )。主要以技術交流、內推、行業探討為主,請文明發言。 廣告人士勿入,切勿輕信私聊,防止被騙。

    掃碼加我好友,拉你進群

    PS:因為公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下 在看 ,加個 星標 ,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。 在看 支持我們吧!