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

代码到Redis之间的中间层操作|Redis的增删改查

2015-12-03 14:31 459 查看
在使用Redis的过程中,遇到了如下问题,如何将一张关系表放入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的一些操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 Redis