将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
将ip对应城市数据导入redis并查询的更多相关文章
- 通过管道传输快速将MySQL的数据导入Redis
通过管道传输pipe将MySQL数据批量导入Redis 自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redis Mass Insertion,即Pipe传输, ...
- Mysql百万数据量级数据快速导入Redis
前言 随着系统的运行,数据量变得越来越大,单纯的将数据存储在mysql中,已然不能满足查询要求了,此时我们引入Redis作为查询的缓存层,将业务中的热数据保存到Redis,扩展传统关系型数据库的服务能 ...
- Redis数据导入工具优化过程总结
Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...
- 如何将redis中的数据导入到本地MongoDB和MySQL数据库
将redis中的数据导入到本地MongoDB数据库 创建一个process_items_mongodb.py文件(文件名自定义): #!/usr/bin/env python # -*- coding ...
- Redis 数据总结(1 数据导入)
理论基础部分:http://www.redis.cn/topics/mass-insert.html 几百上千万的数据建议使用pipe来完成导入. 1.windows 下数据导入命令: type ou ...
- 日志收集之--将Kafka数据导入elasticsearch
最近需要搭建一套日志监控平台,结合系统本身的特性总结一句话也就是:需要将Kafka中的数据导入到elasticsearch中.那么如何将Kafka中的数据导入到elasticsearch中去呢,总结起 ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- Python 爬取 热词并进行分类数据分析-[云图制作+数据导入]
日期:2020.01.28 博客期:136 星期二 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入](本期博客) ...
- 使用GO语言通过Stream Load实现Doris数据导入
Doris github地址欢迎加Star apache/incubator-doris: Apache Doris(Incubating) is an MPP-based interactive S ...
随机推荐
- Spring注解@Resource和@Autowired区别对比、spring扫描的默认bean的Id、程序获取spring容器对象
-------------------------注解扫面的bean的ID问题-------------------------- 0.前提需要明白注解扫描出来的bean的id默认是类名首字母小写,当 ...
- Linux-进程间通信(四): 域套接字
1. 域套接字: (1) 只能用于同一设备上不同进程之间的通信: (2) 效率高于网络套接字.域套接字仅仅是复制数据,并不走协议栈: (3) 可靠,全双工: 2. 域套接字地址结构: struct s ...
- selenium===requestium模块介绍
有时,你可能会在网上实现一些自动化操作.比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要.Python提供了非常优秀的Requests库可以辅助进行这些操作.可惜, ...
- 64_l1
L-function-1.23-18.fc26.i686.rpm 13-Feb-2017 23:19 154562 L-function-1.23-18.fc26.x86_64.rpm 13-Feb- ...
- centos_7.1.1503_src_1
http://vault.centos.org/7.1.1503/os/Source/SPackages/ 389-ds-base-1.3.3.1-13.el7.src.rpm 31-Mar-2015 ...
- 设计模式之笔记--原型模式(Prototype)
原型模式(Prototype) 定义 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 类图 描述 提供一个克隆自身的接口--Clone方法. 应用场景 ...
- Git——Git常用命令速查表
- MYSQL表中设置字段类型为TIMESTAMP时的注意事项
在MYSQL中,TIMESTAMP类型是用来表示日期的,但是和DATETIME不同,不同点就不再这里说明了. 当我们在使用TIMESTAMP类型设置表中的字段时,我们应该要注意一点,首先我们在表中新增 ...
- jstorm系列-1:入门
一. Storm整体介绍 Storm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这 ...
- rabbitmq在centos7下安装
知识预览 一. RabbitMQ队列 二. 事例 三.基于RabbitMQ的RPC 回到顶部 一. RabbitMQ队列 ? 1 2 3 4 5 #消息中间件 -消息队列 - 异步 提交的任务不需 ...