简介
ip2region - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。
github地址:https://github.com/lionsoul2014/ip2region
golang的SDK:https://github.com/lionsoul2014/ip2region/tree/master/maker/golang
特性
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 操作,保持微秒级别的查询效率。
例子
希望你喜欢!
package iplocator
import (
"fmt"
"strings"
"sync"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
"github.com/mlogclub/simple/common/dates"
"github.com/mlogclub/simple/common/strs"
"github.com/sirupsen/logrus"
)
var (
once sync.Once
searcher *xdb.Searcher
)
func InitIpLocator(dbPath string) {
once.Do(func() {
if strs.IsBlank(dbPath) {
dbPath = "ip2region.xdb"
}
start := dates.NowTimestamp()
data, err := xdb.LoadContentFromFile(dbPath)
if err != nil {
logrus.Errorf("failed to load content from `%s`: %s\n", dbPath, err)
return
}
if searcher, err = xdb.NewWithBuffer(data); err != nil {
logrus.Errorf("failed to create searcher with content: %s\n", err)
return
}
fmt.Printf("Load ip2region.xdb success, elapsed %d ms\n", dates.NowTimestamp()-start)
})
}
func Search(ip string) string {
if searcher == nil || strs.IsBlank(ip) {
return ""
}
region, _ := searcher.SearchByStr(ip)
return region
}
func IpLocation(ip string) string {
region := Search(ip) // eg. 中国|0|湖北省|武汉市|电信
if strs.IsBlank(region) {
return ""
}
ss := strings.Split(region, "|")
if len(ss) != 5 {
return ""
}
var (
nation = ss[0]
province = ss[2]
)
if strs.IsNotBlank(province) && province != "0" {
return province
}
if strs.IsNotBlank(nation) && nation != "0" {
return nation
}
return ""
}
func main() {
InitIpLocator("/root/ip2region.xdb") //https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb
fmt.Println(Search("29.34.191.255"))
fmt.Println(IpLocation("29.34.191.255"))
}