【redis】redis操作GeoLiteCity

通过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);
    }

测试结果



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值