您的位置:首页 > 数据库 > Redis

【redis】redis操作GeoLiteCity

2015-12-23 16:13 801 查看

通过geoip和离线GeoLiteCity.dat文件可以根据IP查询相关信息

http://blog.csdn.net/michaeljy1991/article/details/50385418

通过将GeoLiteCity-latest.zip的csv文件写到redis中,再通过IP查询相关信息

下载GeoLiteCity-latest.zip

命令:<span style="color:#FF0000;">wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip</span> jiayi@ubuntu:~/soft/redis-3.0.5$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip --2015-12-23 15:58:12-- http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip Resolving geolite.maxmind.com (geolite.maxmind.com)... 141.101.115.190, 141.101.114.190
Connecting to geolite.maxmind.com (geolite.maxmind.com)|141.101.115.190|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 32282459 (31M) [application/zip]
Saving to: ‘GeoLiteCity-latest.zip’

21% [=======================> ] 6,814,751 140KB/s eta 91s ^

由于文件比较大,我已上传至CSDN  http://download.csdn.net/detail/michaeljy1991/9373860

思路







GeoLiteCity-Blocks.csv文件信息:城市ID和IP地址的起始范围。(注意这里的IP是经过一定规则转化的,后面会涉及)

GeoLiteCity-Location.csv文件信息:城市ID和其他信息(国家、城市、经度、纬度等)

将IP转为GeoLiteCity-Blocks.csv的数值 IPToScore

public long ipToScore(String ipAddress) {
long score = 0;
for (String v : ipAddress.split("\\.")){
score = score * 256 + Integer.parseInt(v, 10);
}
return score;
}

将GeoLiteCity-Blocks.csv导入redis importIPsToRedis

public void importIpsToRedis(Jedis jedis, File file) {
try(Reader reader = new FileReader(file)){
CSVParser parser = new CSVParser(reader, CSVFormat.newFormat(','));
List<CSVRecord> data = parser.getRecords();
for (CSVRecord record:data){
long num = record.getRecordNumber();
if (num<3){
continue;
}
jedis.zadd("ip2cityid:",Long.valueOf(record.get(0).replaceAll("\"","")),record.get(2).replaceAll("\"","")+"_0");
jedis.zadd("ip2cityid:",Long.valueOf(record.get(1).replaceAll("\"","")),record.get(2).replaceAll("\"","")+"_1");
}
}catch(Exception e) {
e.printStackTrace();
}
}

将GeoLiteCity-Location.csv导入redis importCitiesToRedis

public void importCitiesToRedis(Jedis jedis, File file) {
Gson gson = new Gson();
try(Reader reader = new FileReader(file) ){
CSVParser parser = new CSVParser(reader,CSVFormat.newFormat(','));
List<CSVRecord> data = parser.getRecords();
for (CSVRecord record:data){
long num = record.getRecordNumber();
if (num<3){
continue;
}
String cityId = record.get(0).replaceAll("\"","");
String country = record.get(1).replaceAll("\"","");
String region = record.get(2).replaceAll("\"","");
String city = record.get(3).replaceAll("\"","");
String postalCode = record.get(4).replaceAll("\"","");
String latitude = record.get(5).replaceAll("\"","");
String longitude = record.get(6).replaceAll("\"","");
String metroCode = record.get(7).replaceAll("\"","");
String areaCode = record.get(8).replaceAll("\"","");
jedis.hset("cityid2city:",cityId,gson.toJson(new String[]{country, region, city, postalCode, latitude, longitude, metroCode, areaCode}));
}
}catch(Exception e){
throw new RuntimeException(e);
}
}


根据IP查询城市等相关信息 findCityByIP

public String[] findCityByIp(Jedis conn, String ipAddress) {
long score = ipToScore(ipAddress);
Set<String> results = conn.zrevrangeByScore("ip2cityid:", score, 0, 0, 1);
if (results.size() == 0) {
return null;
}

String cityId = results.iterator().next();
cityId = cityId.substring(0, cityId.indexOf('_'));
return new Gson().fromJson(conn.hget("cityid2city:", cityId), String[].class);
}

测试结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: