戳下方名片 ,關註並 星標 !
回復「 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:因為公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下 「 在看 」 ,加個 「 星標 」 ,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。 點 「 在看 」 支持我們吧!