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


在使用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的一些操作



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值