在使用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) {//连接redisredis = new Jedis("192.168.47.130", 6379);try {conn = getConnection();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}long startTime = System.currentTimeMillis();try {redisInsert();} catch (Exception e) {// TODO Auto-generated catch blocke.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 blocke.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之间的中间层操作|Redis的增删改查相关推荐

  1. 怎么用php操作mysql删除数据库代码_如何使用php操作mysql的增删改查?

    php操作mysql的增删改查方法:1.插入语句[insert into 数据表名(字段1,字段2,....) values("值1","值2",..)]:2. ...

  2. 【node】Sequelize常用操作、基本增删改查

    [node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...

  3. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  4. SpringBoot操作MongoDB实现增删改查

    本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...

  5. jdbc链接mysql按照id查询_使用jdbc连接并操作Oracle数据库(增删改查IDUS)

    使用jdbc连接并操作Oracle数据库(增删改查IDUS) [oracle@zaibei-db ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Pro ...

  6. eggjs增删改查MySQL,nodejs操作mysql实现增删改查

    首先需要安装mysql模块:npm install mysql –save 然后创建user数据表: 接着使用nodejs对数据库进行增删改查: //引入mysql模块 var mysql = req ...

  7. nodejs mysql 增删改查_nodejs操作mysql实现增删改查的实例

    首先需要安装mysql模块:npm install mysql --save 然后创建user数据表: 接着使用nodejs对数据库进行增删改查: .[活动]2017 CSDN博客专栏评选 [评论送书 ...

  8. SpringBoot使用Redis和MyBatis完成缓存数据的增删改查

    文章目录 1.在Spring Boot中集成Redis 2.配置Redis类 关于Redis Template中序列化和反序列化配置的解释 3.创建测试实体类 4.实现实体和数据表的映射关系 5.创建 ...

  9. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub

    GitHub项目地址: https://github.com/Skymqq/LitePalSave.git LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)映射的模式 ...

最新文章

  1. 实验0 了解和熟悉操作系统
  2. 博为峰JavaEE技术文章 —— Hibernate 指南(3)Hbm文件
  3. 空心磁珠铁氧体抗干扰屏蔽磁环RH磁通高频磁芯圆形穿心磁珠滤波器
  4. LeNet试验(一) 搭建pytorch版模型及运行
  5. sql 注入神器sqlmap 源码分析之调试sqlmap
  6. 年薪60w财务总监的加薪秘诀:从不用Excel做报表
  7. Kava将于下午2时重新启动Kava Chain
  8. iOS开发之SceneKit框架--实战地月系统围绕太阳旋转
  9. htmlspecialchars_decode 与 html_entity_decode
  10. 38. 后台模块开发(3)
  11. MagicDraw 18.5 SP4
  12. 跟我学AngularJs:Directive指令用法解读(上)
  13. 萌新记一次在openEuler下安装VMware-Tools的失败经历
  14. python发html邮件_在python中如何制作发送HTML格式的邮件?
  15. 【点云3D目标检测】跑通CIA-SSD过程中的一些报错集锦
  16. 为什么“高大上”的算法工程师变成了数据民工?
  17. Cortex-M系列:错误异常
  18. Python——文件与IO
  19. 利用框架效应达成目的
  20. 爬取电影网最新电影资源链接地址[1]

热门文章

  1. Python——玩转PPT自动化
  2. php如何把时间转化为时间戳,学习猿地-php怎么将时间转化为时间戳
  3. 江苏南通与苏州间将建跨江城际铁路
  4. 安装FREENAS 虚拟机
  5. 直播市场这么热闹,只有这几家公司闷声发大财
  6. 如何成为月入五万的程序员,他们告诉你!
  7. Matlab平台下Nvidia显卡和Intel I7 CPU的并行计算性能比较:第一次测试
  8. cnvd事件型高危漏洞挖掘
  9. WRITE_ONCE()
  10. 京东店铺所有商品API接口