將ip對應城市數據導入redis並查詢


1.GeoLite免費數據庫

  先去地址http://dev.maxmind.com/zh-hans/geoip/legacy/geolite/#i-5下載GeoLiteCity-latest .zip壓縮包,數據庫包包含兩個重要的文件:一個是GeoLiteCity-Blocks.csv,它記錄了多個IP地址段以及這些地址所屬城市的ID,另一個GeoLiteCity-Location.csv,它記錄了對應城市與城市名,地區/州名/省名、國家名一級一些不會用到的其他信息直接的映射。先通過ip查找ip所屬城市的id,然后根據城市id查找對應的城市的實際信息

2.編寫java程序將CSV導入redis

  city類:

public class City {
    //城市id
    private String cityId;
    //國家
    private String country;
    //區域
    private String region;
    //城市名
    private String city;
    //郵政編碼
    private String postalCode;
    //緯度
    private String latitude;
    //經度
    private String longitude;
    //都市號
    private String metroCode;
    //區號
    private String areaCode;

    public String getCityId() {
        return cityId;
    }

    public void setCityId(String cityId) {
        this.cityId = cityId;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getMetroCode() {
        return metroCode;
    }

    public void setMetroCode(String metroCode) {
        this.metroCode = metroCode;
    }

    public String getAreaCode() {
        return areaCode;
    }

    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }

}

 

  config類:

public class Config {
    
    public static final String GEOLITECITY_LOCATION="E://ip/GeoLiteCity-Location.csv";
    
    public static final String GEOLITECITY_BLOCKS="E://ip/GeoLiteCity-Blocks.csv";
    
    public static final String IP2CITYID="ip2cityid:";
    
    public static final String CITYID2CITY="cityid2city:";

}

  data2redis類:

public class Data2Redis {
    
    public long toSore(String ipAddress){
        long score=0;
        for(String str:ipAddress.split("\\."))
            score= score*256 + Integer.parseInt(str, 10);
        return score;
    }
    
    public void ipToRedis(Jedis jedis,File file){
        Pipeline pipeline=jedis.pipelined();
        try {
            System.out.println("導入ip地址開始");
            long startTime=System.currentTimeMillis();
            Reader reader=new FileReader(file);
            CSVParser parser=new CSVParser(reader,CSVFormat.newFormat(',') );
            List<CSVRecord> list=parser.getRecords();
            for(CSVRecord record : list ){
                long num=record.getRecordNumber();
                if(num<3)
                    continue;
                pipeline.zadd(Config.IP2CITYID,Long.valueOf(replaceSprit(record.get(0))),replaceSprit(record.get(2))+"_0");  
                pipeline.zadd(Config.IP2CITYID,Long.valueOf(replaceSprit(record.get(1))),replaceSprit(record.get(2))+"_1");    
            }
            pipeline.syncAndReturnAll();
            parser.close();
            reader.close();
            long endTime=System.currentTimeMillis();
            System.out.println("------------");
            System.out.println("導入ip地址完成");
            System.out.println("耗時:"+(endTime-startTime));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void citiesToRedis(Jedis jedis,File file){
        Gson gson=new Gson();
        Pipeline pipeline=jedis.pipelined();
        try {
            System.out.println("導入城市地址開始");
            long startTime=System.currentTimeMillis();
            Reader reader =new FileReader(file);
            CSVParser parser=new CSVParser(reader,CSVFormat.newFormat(',') );
            List<CSVRecord> list=parser.getRecords();
            City city=new City();
            for(CSVRecord record : list){
                long num=record.getRecordNumber();
                if(num<3)
                    continue;
                record2City(city, record);
                pipeline.hset(
                        Config.CITYID2CITY, 
                        city.getCityId(),
                        gson.toJson(city));
            }
            pipeline.syncAndReturnAll();
            parser.close();
            reader.close();
            long endTime=System.currentTimeMillis();
            System.out.println("------------");
            System.out.println("導入城市地址完成");
            System.out.println("耗時:"+(endTime-startTime));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void record2City(City city, CSVRecord record){
        city.setCityId(replaceSprit(record.get(0)));
        city.setCountry(replaceSprit(record.get(1)));
        city.setRegion(replaceSprit(record.get(2)));
        city.setCity(replaceSprit(record.get(3)));
        city.setPostalCode(replaceSprit(record.get(4)));
        city.setLatitude(replaceSprit(record.get(5)));
        city.setLongitude(replaceSprit(record.get(6)));
        city.setMetroCode(replaceSprit(record.get(7)));
        city.setAreaCode(replaceSprit(record.get(8)));
    }
    
    public City findByIp(Jedis jedis,String ip){
        long score=toSore(ip);
        Set<String> results=jedis.zrangeByScore(Config.IP2CITYID, score,score);
        if(0 == results.size())
            return null;
        String cityId = results.iterator().next();
        cityId = cityId.substring(0, cityId.indexOf('_'));
        return  new Gson().fromJson(jedis.hget(Config.CITYID2CITY, cityId), City.class);  
    }
    
    private String replaceSprit(String str){
        return str.replaceAll("\"", "");
    }

}

  測試類:

public class MyTest {
    
    @Test
    public void test1(){
        Jedis jedis = RedisClient.getResource();
        Data2Redis data2Redis = new Data2Redis();
        data2Redis.ipToRedis(jedis, new File(Config.GEOLITECITY_BLOCKS));
        RedisClient.returnResource(jedis);
    }
    @Test
    public void test2(){
        Jedis jedis = RedisClient.getResource();
        Data2Redis data2Redis = new Data2Redis();
        data2Redis.citiesToRedis(jedis, new File(Config.GEOLITECITY_LOCATION));
        RedisClient.returnResource(jedis);
    }
    
    @Test
    public void test3(){
        Jedis jedis = RedisClient.getResource();
        Data2Redis data2Redis = new Data2Redis();
        City city= data2Redis.findByIp(jedis, "115.192.111.140");
        if(null == city){
            System.out.println("沒有找到對應的ip");
            return;
        }
        System.out.println(city.getCity());
        RedisClient.returnResource(jedis);
    }
    

}

  參考《redis實戰》p100-p102

   博客鏈接:http://blog.csdn.net/michaeljy1991/article/details/50387644

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM