如何通過ip查詢用戶的歸屬地

背景

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

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

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

場景

  1. 網絡安全調查:當發生網絡攻擊或惡意行為時,通過查詢IP地址的歸屬地可以幫助調查人員追蹤攻擊者的位置和身份,進而采取相應的應對措施。
  2. 電商網站反欺詐:電商平臺可以通過查詢IP的歸屬地來檢測是否有異常行為,如異地登錄或使用虛假身份信息下單,從而防止欺詐行為發生。
  3. 廣告定向投放:在在線廣告市場中,根據用戶所在地區進行IP歸屬地查詢可以幫助廣告主精準定位目標受眾,提高廣告投放效果和ROI。
  4. 地理位置服務:地圖應用、天氣預報和周邊生活服務等可以利用IP歸屬地查詢來確定用戶的大概地理位置,提供個性化的地理服務和信息。
  5. 網站流量分析:網站管理員可以利用IP歸屬地查詢來分析網站訪問的地域分布情況,評估市場覆蓋范圍,制定針對性的營銷策略和內容優化計劃。

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

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

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

ip2region

Ip2region 是什么

ip2region - 是一個離線IP地址定位庫和IP定位數據管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的 xdb 數據生成和查詢客戶端實現。

Ip2region 特性

1、IP 數據管理框架

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

2、數據去重和壓縮

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

3、極速查詢響應

即使是完全基于 xdb 文件的查詢,單次查詢響應時間在十微秒級別,可通過如下兩種方式開啟內存加速查詢:

  1. vIndex 索引緩存 :使用固定的 512KiB 的內存空間緩存 vector index 數據,減少一次 IO 磁盤操作,保持平均查詢效率穩定在10-20微秒之間。
  2. 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 mainimport ("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 mainimport ("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,如果要放在線上如何使用呢?

  1. 以sdk的形式嵌入到項目,使用基于緩存的查詢方式。
  2. ip查詢的場景很多,可以單獨構建一個ip查詢的公共服務,提高給各個業務線使用

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711712.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript繼承

JavaScript繼承 1、JS 的繼承到底有多少種實現方式呢? 2、ES6 的 extends 關鍵字是用哪種繼承方式實現的呢? 繼承種類 原型鏈繼承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…

應用穩定性優化1:ANR問題全面解析

閃退、崩潰、無響應、重啟等是應用穩定性常見的問題現象,穩定性故障大體可歸類為ANR/凍屏、Crash/Tombstone、資源泄露三大類。本文通過對三類故障的產生原因、故障現象、觸發機制及如何定位等,展開深度解讀。 本文將詳解ANR類故障,并通過一…

寶塔php站點設置偽靜態規則 訪問 a.com 時候跳轉到 a.com/b.html

要在寶塔 PHP 站點中設置偽靜態規則,實現訪問a.com時跳轉到a.com/b.html,可以按照以下步驟進行操作: 打開寶塔面板并登錄到你的服務器管理界面。進入網站設置頁面,找到你要設置偽靜態規則的 PHP 站點。在站點設置中,找…

已解決System.ServiceModel.EndpointNotFoundException端點未找到異常的正確解決方法,親測有效!!!

已解決System.ServiceModel.EndpointNotFoundException端點未找到異常的正確解決方法,親測有效!!! 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 總結 在開發和使用基于Windows Communication Foundation (WC…

【前端素材】推薦優質后臺管理系統cassie平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面,通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面,使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

解鎖AI大模型秘籍:未來科技的前沿探索

在當今這個技術高速發展的時代,人工智能(AI)已經成為了我們生活中不可或缺的一部分。從簡單的個人助手到復雜的數據分析和決策制定,AI的應用范圍日益擴大,其目的是為了讓我們的生活變得更加智能化。本文旨在探討AI如何…

【單片機學習的準備】

文章目錄 前言一、找一個視頻是二、畫圖軟件三、裝keil5 仿真protues總結 前言 提示:這里可以添加本文要記錄的大概內容: 項目需要: 提示:以下是本篇文章正文內容,下面案例可供參考 一、找一個視頻是 https://www.b…

一文了解Lint工具的優缺點,以及它與高級靜態分析工具的比較

避免軟件缺陷是所有開發者的共同追求,因為一旦出現錯誤,可能導致用戶體驗下降,甚至威脅到關鍵系統的安全。不論您正在開發何種類型的程序,避免這些缺陷都是至關重要的。這就是為什么許多開發團隊都依賴Lint。 什么是Linting&#…

農產品質量追溯系統—簡介

概要 農產品質量安全事關廣大人民群眾的食用安全和身體健康。解決農產品質量安全問題,需要從源頭開始抓好、抓實農產品安全監管工作。通過建立從產地到市場的全程質量控制系統和追溯制度,對農產品產地環境、生產過程、產品檢測、包裝盒標識等關鍵環節進行監督管理,提高廣大…

Kubernetes(k8s第一部分)

這個技術一定會成為以后企業技術的標準 尙硅谷的王陽這個部分這個講的特別好,可以自己去看 1,發展經歷 阿里云iaas Infrastructure as a Service 平臺及服務paas新浪云 platform as a service(號稱免運維)(docker是下一代的標準&#x…

模板初階的補充和string一些函數的用法

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 模板初階的補充 一、C語言中的字符串 二、標準庫中的string類 2.1 string類(了解) 2.2 string類的常用接口說明(注意下面我只講解最常用的接口&…

SpringBoot中自動裝配機制

自動裝配簡單來說,就是自動去把第三方組件的Bean裝載到IoC容器里面,不需要開發人員再去寫Bean相關的一個配置。在Spring Boot的應用里面,只需要在啟動類上去加上Spring Boot Application注解就可以去實現自動裝配,Spring Boot App…

精品ssm的社區團購系統購物商城小程序

《[含文檔PPT源碼等]精品基于ssm的社區團購系統[包運行成功]》該項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、包運行成功! 軟件開發環境及開發工具: Java——涉及技術: 前端使用技術:HTML5,CSS3、Jav…

Sophon AutoCV推動AI應用從模型生產到高效落地

隨著技術市場和應用方向的逐漸成熟,人工智能與各行各業的結合和落地逐漸進入了深水區。 雖然由于行業規模化和應用普及度的限制,人工智能在“傳統”行業的落地不如消費互聯網行業,但是借助人工智能為“傳統”行業的發展注入新能量一直是相關…

流程的Python(十五)-上下文管理器和else塊

一、核心要義 1. for, while和try語句的else字句 2. with語句和上下文管理器 二、代碼示例 1、else塊 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/2/28 20:14 # Author : Maple # File : 01-else塊.py # Software: PyCharm""" 用…

lottie加載帶圖片的json 預覽

背景 產品看到一款app的動效很不錯,讓我去模仿實現。 第一步 獲取apk中的靜態資源 拿到這個app的apk后,直接使用壓縮工具解壓, assets文件夾就是靜態資源的目錄 靜態資源里面有lottie 那么大部分的動效應該都是lottie實現的 網上找了很多…

一些常見的SpringBoot面試題

以下是一些常見的SpringBoot面試題: 1. 什么是SpringBoot? * SpringBoot是一個開源的Java框架,用于簡化Spring應用程序的創建和部署。它提供了許多內置的功能,如自動配置、嵌入式Web服務器、安全性、健康檢查等,使得…

經銷商文件分發 怎樣兼顧安全和效率?

經銷商文件分發是指將文件、資料、產品信息等從制造商或經銷商傳遞給經銷商的過程。這一過程對于確保經銷商能夠獲取最新的產品信息、銷售策略、市場活動資料等至關重要。 想要管理眾多經銷商合作伙伴之間的文件傳輸并提高效率,可以采取以下措施: 1、建…

機器學習 -- 梯度下降算法加深

梯度下降算法 在機器學習中,梯度下降算法常用于最小化代價函數(或損失函數),以此來優化模型的參數。代價函數衡量的是模型預測值與實際值之間的差異。通過最小化這個函數,我們可以找到模型預測最準確的參數。 代價函…