平山做网站优化,南宁网站建站推广,平台网站怎么建设,wordpress+扫码付款背景
最近公司做了一些营销活动#xff0c;投入资金进行了流量推广#xff0c;pv、UV都做了统计。老板说#xff0c;我要看下用户的区域分布的数据。
以前的文章我讲过#xff0c;pv、UV如何统计#xff1f;我们是基于ip进行统计的。用的ip能获取到#xff0c;那通过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 特性
1、IP 数据管理框架
xdb 支持亿级别的 IP 数据段行数默认的 region 信息都固定了格式国家|区域|省份|城市|ISP缺省的地域信息默认是0。 region 信息支持完全自定义例如你可以在 region 中追加特定业务需求的数据例如GPS信息/国际统一地域信息编码/邮编等。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据。
2、数据去重和压缩
xdb 格式生成程序会自动去重和压缩部分数据默认的全部 IP 数据生成的 ip2region.xdb 数据库是 11MiB随着数据的详细度增加数据库的大小也慢慢增大。
3、极速查询响应
即使是完全基于 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 mainimport (fmtgithub.com/lionsoul2014/ip2region/binding/golang/xdbtime
)func main() {//dbPath写入你下载的ip2region.xdb文件的路径我这里放在了当前目录下var dbPath ip2region.xdbsearcher, 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.248var 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 (fmtgithub.com/lionsoul2014/ip2region/binding/golang/xdbtime
)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.248var 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查询归属地公共服务往外提供查询的能力。后续服务的升级、维护等统一在公共服务里面来做。