一、快速上手
下面给出三种主流语言的最小可用示例。
Java
Maven 依赖:
<dependency><groupId>net.cz88</groupId><artifactId>czdb-search</artifactId><version>1.0.2.10</version></dependency>代码:
importnet.cz88.czdb.DbSearcher;importnet.cz88.czdb.QueryType;publicclassDemo{publicstaticvoidmain(String[]args){// MEMORY 模式线程安全,适合做成单例DbSearchersearcher=newDbSearcher("/data/ipv4.czdb",QueryType.MEMORY,"你的密钥");Stringregion=searcher.search("114.114.114.114");System.out.println(region);searcher.close();}}Python
pipinstallczdb-searcherfromczdb.db_searcherimportDbSearcher searcher=DbSearcher("/data/ipv4.czdb","MEMORY","你的密钥")print(searcher.search("114.114.114.114"))searcher.close()Go
go get github.com/tagphi/czdb-search-golangpackagemainimport("fmt""github.com/tagphi/czdb-search-golang/pkg/db")funcmain(){searcher,err:=db.InitDBSearcher("/data/ipv4.czdb","你的密钥",db.MEMORY)iferr!=nil{panic(err)}deferdb.CloseDBSearcher(searcher)region,err:=db.Search("114.114.114.114",searcher)iferr==nil{fmt.Println(region)}}二、实战中容易踩的几个坑
结合官方 SDK 文档,有几点务必注意:
DbSearcher 一定要复用,做成单例。
每次查询都 new 一个 Searcher 会反复加载/解密数据库,性能会崩。BTREE 模式不是线程安全的。
高并发下要么改用 MEMORY,要么给每个工作线程分配一个独立的 DbSearcher 实例,线程结束时再close()。BTREE 高并发可能出现“打开文件过多”。
需要调大系统的fs.file-max,但更推荐的做法仍是 MEMORY 模式或“一线程一实例”。记得更新数据。
IP 段会不断重新分配,建议订阅官方更新,定期替换.czdb文件,避免归属地判断过时。数据合规。
本地部署的好处之一就是数据不必外发到第三方,但自己的业务仍需遵守个人信息保护相关规定。
三、适合什么场景?
- 🛡️风控 / 反欺诈:实时判断登录、下单 IP 的归属地与运营商;
- 📊日志分析 / BI:离线批量解析海量访问日志,做地域分布看板;
- 🌐地域化运营:根据用户所在省市做内容分发、限流或合规策略;
- 🔌网关 / 中间件:在 API 网关里做毫秒级 IP 判定。