代码到Redis之间的中间层操作|Redis的增删改查
2015-12-03 14:31
459 查看
在使用Redis的过程中,遇到了如下问题,如何将一张关系表放入Redis
Redis是KV型数据库,和关系表完全不在同一个频率,所以没办法简单的导入,我在网上看到有快速自动将mysql表读取到redis的资料,但是我的开发环境在win下,就不再去尝试了。主要是数据量也不大,通过最基本的办法,逐行读取关系表,以主键作为KEY,将剩下的字段值包装为map,置入Redis。
tips:Redis比较人性,支持很多种基本数据结构,包括list,set,map等。也可以将pojo对象直接传入,但是需要序列化。
贴上导入代码
好了,到这里我把数据录入redis中。
有一点要注意,我不是单单把主键和后面的数据录入进去,如果这样我需要数据只能用主键提取,但是主键是自增id,并没有实际意义。我需要做条件查询。那么问题就来了。
我需要做类似
的查询,在kv数据库中并没有sql语句让你使用,那么就只能一狠心再插入一次了,代码中我需要对site_board_url做查询,所以我将这个字段做为key,映射到那个自增id上。但这是不够的,site_board_url这个字段并非是不重复的,然而kv数据库的key是唯一的,所以我加上了hashcode,让他成为唯一,这样就可以完成一次条件查询了。相当麻烦,所以redis本身只能做为一个缓存服务器,我觉得做数据库真的很勉强。
接下来,贴上做为代码到Redis的中间层代码
package com.xmmy.cloud.preprocess.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import redis.clients.jedis.Jedis;
import com.xmmy.cloud.preprocess.config.CommonConfig;
import com.xmmy.cloud.preprocess.db.dao.StatisticsOfSBADaoImpl;
import com.xmmy.cloud.preprocess.db.pojo.StatisticsOfSiteBoardArea;
/**
* 为从redis中查询和
* 获取数据设计的类
* @author huangqq
*
*/
public class RedisUtil {
public static void main(String[] args) {
String site_board_url = "http://tieba.baidu.com/f?kw=%E7%FA%E7%EA&ie=utf-8";
TreeMap<Integer, StatisticsOfSiteBoardArea> hisCities = null;
//原来的
StatisticsOfSBADaoImpl ssbaImpl = StatisticsOfSBADaoImpl.getInstance();
try {
hisCities = ssbaImpl.getReferAreaHMByURL(site_board_url);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(hisCities);
//现在的
hisCities = selectReferAreasByURL(site_board_url);
System.out.println(hisCities);
}
/**
* 更新和插入
*/
public static void insertOrUpdate(StatisticsOfSiteBoardArea obj) {
Jedis redis = new Jedis(CommonConfig.redisServerIP, CommonConfig.redisServerPort);
Map<String, String> map = new HashMap<String, String>();
map.put("site_board_url", obj.getSite_board_url());
map.put("country_id", obj.getCountry_id() + "");
map.put("province_id", obj.getProvince_id() + "");
map.put("city_id", obj.getCity_id() + "");
map.put("count", obj.getCount() + "");
map.put("uncertain_count", obj.getUncertain_count() + "");
map.put("fp_count", obj.getFp_count() + "");
map.put("latest_probability", obj.getLatest_Probability() + "");
redis.hmset(hashCode(map) + "", map);
redis.set("site_board_url:" + obj.getSite_board_url() + ":" + hashCode(map) + "", hashCode(map) + "");
}
/**
* 查询site_board_url与参数相等的数据
*/
public static TreeMap<Integer, StatisticsOfSiteBoardArea> selectReferAreasByURL(String url) {
Jedis redis = new Jedis(CommonConfig.redisServerIP, CommonConfig.redisServerPort);
TreeMap<Integer, StatisticsOfSiteBoardArea> hm = new TreeMap<Integer, StatisticsOfSiteBoardArea>();
List<StatisticsOfSiteBoardArea> arr = new LinkedList<StatisticsOfSiteBoardArea>();
Iterator<String> it = redis.keys("site_board_url:" + url + ":*").iterator();
while (it.hasNext()) {
try {
//System.out.println(mapToPojo(redis.hgetAll(redis.get(it.next()))).getCity_id());
//System.out.println(redis.get(it.next()));
arr.add(mapToPojo(redis.hgetAll(redis.get(it.next()))));
} catch (Exception e) {
// System.out.println("to id");
}
}
for(StatisticsOfSiteBoardArea t:arr){
hm.put(t.getCity_id(), t);
}
return hm;
}
/**
* 查询出所有的site_board_url
*/
public static List<StatisticsOfSiteBoardArea> listBoardURLs() {
Jedis redis = new Jedis(CommonConfig.redisServerIP, CommonConfig.redisServerPort);
List<StatisticsOfSiteBoardArea> arr = new LinkedList<StatisticsOfSiteBoardArea>();
Iterator<String> it = redis.keys("*").iterator();
//System.out.println(redis.hgetAll("*"));
while (it.hasNext()) {
try {
//System.out.println(redis.hgetAll(redis.get(it.next())).get("site_board_url"));
arr.add(mapToPojo(redis.hgetAll(it.next())));
} catch (Exception e) {
// System.out.println("to id");
}
}
return arr;
}
public static StatisticsOfSiteBoardArea mapToPojo(Map<String, String> map) {
StatisticsOfSiteBoardArea sosba = new StatisticsOfSiteBoardArea();
sosba.setSite_board_url(map.get("site_board_url"));
sosba.setCountry_id(Integer.parseInt(map.get("country_id")));
sosba.setProvince_id(Integer.parseInt(map.get("province_id")));
sosba.setCity_id(Integer.parseInt(map.get("city_id")));
sosba.setCount(Double.parseDouble(map.get("count")));
sosba.setUncertain_count(Double.parseDouble(map.get("uncertain_count")));
sosba.setFp_count(Double.parseDouble(map.get("fp_count")));
sosba.setLatest_Probability(Double.parseDouble(map.get("latest_probability")));
return sosba;
}
public static int hashCode(Object obj) {
int hash = 1;
hash = hash * 31 + obj.hashCode();
return hash;
}
}
由这层代码来执行对Redis的一些操作
Redis是KV型数据库,和关系表完全不在同一个频率,所以没办法简单的导入,我在网上看到有快速自动将mysql表读取到redis的资料,但是我的开发环境在win下,就不再去尝试了。主要是数据量也不大,通过最基本的办法,逐行读取关系表,以主键作为KEY,将剩下的字段值包装为map,置入Redis。
tips:Redis比较人性,支持很多种基本数据结构,包括list,set,map等。也可以将pojo对象直接传入,但是需要序列化。
贴上导入代码
package com.huangqq.redis; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import redis.clients.jedis.Jedis; public class Redis { public static Jedis redis = null; public static Connection conn = null; public static void main(String[] args) { //连接redis redis = new Jedis("192.168.47.130", 6379); try { conn = getConnection(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } long startTime = System.currentTimeMillis(); try { redisInsert(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("共耗费 " + (endTime - startTime) + " ms"); } public static void redisUpdate() { } public static void redisInsert() throws Exception { int n = 0; String sql = "SELECT * FROM siteboard_area_statistics"; ResultSet rs = conn.prepareCall(sql).executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); while (rs.next()) { n++; HashMap<String, String> map = new HashMap<>(); //map.put("id", rs.getInt("id") + ""); map.put("site_board_url", rs.getString("site_board_url")); map.put("country_id", rs.getInt("country_id") + ""); map.put("province_id", rs.getInt("province_id") + ""); map.put("city_id", rs.getInt("city_id") + ""); map.put("count", rs.getDouble("count") + ""); map.put("uncertain_count", rs.getDouble("uncertain_count") + ""); map.put("fp_count", rs.getDouble("fp_count") + ""); map.put("latest_probability", rs.getDouble("latest_probability") + ""); redis.hmset(rs.getInt("id") + "", map); redis.set("site_board_url:" + rs.getString("site_board_url") + ":" + map.hashCode(), rs.getInt("id") + ""); } System.out.println("n = " + n); } public static Connection getConnection() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://xxx.xxx.xxx.xxx:8001/pretreatment?useUnicode=true&characterEncoding=UTF-8"; String username = "root"; String password = "root"; return DriverManager.getConnection(dburl, username, password); } }
好了,到这里我把数据录入redis中。
有一点要注意,我不是单单把主键和后面的数据录入进去,如果这样我需要数据只能用主键提取,但是主键是自增id,并没有实际意义。我需要做条件查询。那么问题就来了。
我需要做类似
select * from xxx where a = 'yyy'
的查询,在kv数据库中并没有sql语句让你使用,那么就只能一狠心再插入一次了,代码中我需要对site_board_url做查询,所以我将这个字段做为key,映射到那个自增id上。但这是不够的,site_board_url这个字段并非是不重复的,然而kv数据库的key是唯一的,所以我加上了hashcode,让他成为唯一,这样就可以完成一次条件查询了。相当麻烦,所以redis本身只能做为一个缓存服务器,我觉得做数据库真的很勉强。
接下来,贴上做为代码到Redis的中间层代码
package com.xmmy.cloud.preprocess.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import redis.clients.jedis.Jedis;
import com.xmmy.cloud.preprocess.config.CommonConfig;
import com.xmmy.cloud.preprocess.db.dao.StatisticsOfSBADaoImpl;
import com.xmmy.cloud.preprocess.db.pojo.StatisticsOfSiteBoardArea;
/**
* 为从redis中查询和
* 获取数据设计的类
* @author huangqq
*
*/
public class RedisUtil {
public static void main(String[] args) {
String site_board_url = "http://tieba.baidu.com/f?kw=%E7%FA%E7%EA&ie=utf-8";
TreeMap<Integer, StatisticsOfSiteBoardArea> hisCities = null;
//原来的
StatisticsOfSBADaoImpl ssbaImpl = StatisticsOfSBADaoImpl.getInstance();
try {
hisCities = ssbaImpl.getReferAreaHMByURL(site_board_url);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(hisCities);
//现在的
hisCities = selectReferAreasByURL(site_board_url);
System.out.println(hisCities);
}
/**
* 更新和插入
*/
public static void insertOrUpdate(StatisticsOfSiteBoardArea obj) {
Jedis redis = new Jedis(CommonConfig.redisServerIP, CommonConfig.redisServerPort);
Map<String, String> map = new HashMap<String, String>();
map.put("site_board_url", obj.getSite_board_url());
map.put("country_id", obj.getCountry_id() + "");
map.put("province_id", obj.getProvince_id() + "");
map.put("city_id", obj.getCity_id() + "");
map.put("count", obj.getCount() + "");
map.put("uncertain_count", obj.getUncertain_count() + "");
map.put("fp_count", obj.getFp_count() + "");
map.put("latest_probability", obj.getLatest_Probability() + "");
redis.hmset(hashCode(map) + "", map);
redis.set("site_board_url:" + obj.getSite_board_url() + ":" + hashCode(map) + "", hashCode(map) + "");
}
/**
* 查询site_board_url与参数相等的数据
*/
public static TreeMap<Integer, StatisticsOfSiteBoardArea> selectReferAreasByURL(String url) {
Jedis redis = new Jedis(CommonConfig.redisServerIP, CommonConfig.redisServerPort);
TreeMap<Integer, StatisticsOfSiteBoardArea> hm = new TreeMap<Integer, StatisticsOfSiteBoardArea>();
List<StatisticsOfSiteBoardArea> arr = new LinkedList<StatisticsOfSiteBoardArea>();
Iterator<String> it = redis.keys("site_board_url:" + url + ":*").iterator();
while (it.hasNext()) {
try {
//System.out.println(mapToPojo(redis.hgetAll(redis.get(it.next()))).getCity_id());
//System.out.println(redis.get(it.next()));
arr.add(mapToPojo(redis.hgetAll(redis.get(it.next()))));
} catch (Exception e) {
// System.out.println("to id");
}
}
for(StatisticsOfSiteBoardArea t:arr){
hm.put(t.getCity_id(), t);
}
return hm;
}
/**
* 查询出所有的site_board_url
*/
public static List<StatisticsOfSiteBoardArea> listBoardURLs() {
Jedis redis = new Jedis(CommonConfig.redisServerIP, CommonConfig.redisServerPort);
List<StatisticsOfSiteBoardArea> arr = new LinkedList<StatisticsOfSiteBoardArea>();
Iterator<String> it = redis.keys("*").iterator();
//System.out.println(redis.hgetAll("*"));
while (it.hasNext()) {
try {
//System.out.println(redis.hgetAll(redis.get(it.next())).get("site_board_url"));
arr.add(mapToPojo(redis.hgetAll(it.next())));
} catch (Exception e) {
// System.out.println("to id");
}
}
return arr;
}
public static StatisticsOfSiteBoardArea mapToPojo(Map<String, String> map) {
StatisticsOfSiteBoardArea sosba = new StatisticsOfSiteBoardArea();
sosba.setSite_board_url(map.get("site_board_url"));
sosba.setCountry_id(Integer.parseInt(map.get("country_id")));
sosba.setProvince_id(Integer.parseInt(map.get("province_id")));
sosba.setCity_id(Integer.parseInt(map.get("city_id")));
sosba.setCount(Double.parseDouble(map.get("count")));
sosba.setUncertain_count(Double.parseDouble(map.get("uncertain_count")));
sosba.setFp_count(Double.parseDouble(map.get("fp_count")));
sosba.setLatest_Probability(Double.parseDouble(map.get("latest_probability")));
return sosba;
}
public static int hashCode(Object obj) {
int hash = 1;
hash = hash * 31 + obj.hashCode();
return hash;
}
}
由这层代码来执行对Redis的一些操作
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- redis安装问题小结
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- Redis偶发连接失败案例实战记录
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- Redis中实现查找某个值的范围