声明:本文章仅供参考,学无止境,若有不足之处请指出,非常感谢!

源代码+相关工具下载:https://download.csdn.net/download/corleone_4ever/10811258

目录

一.相关工具

二.准备工作

三.新建jedis项目

四.编写代码

五.连接测试

六.注意事项


一.相关工具

如果没有服务器的同学,可以在自己的电脑安装虚拟机,我这里使用的是:VMware10+centos7+redis5.0

贴出 VMware10+centos7 下载地址:https://download.csdn.net/download/corleone_4ever/10812834

开发工具用的myeclipse2014

jdk版本为1.7

java连接redis所需依赖jar包:

jedis-2.9.0.jar (redis连接工具)

commons-pool2-2.6.0.jar (jedis连接池)

fastjson-1.2.2.jar (阿里的json序列化工具)

junit-4.12.jar (单元测试)

贴出demo下载地址(包含vm10+centos7+redis5.0+jedis连接依赖jar包及其相关工具文档):

https://download.csdn.net/download/corleone_4ever/10811258

二.准备工作

在通过java连接redis之前,首先得配置好java环境

安装好redis,并且能通过外部访问(需要关闭对应防火墙)

1.启动redis

2.输入ifconfig获取本机ip,通过外部连接测试,我这里使用的是RedisDesktopManager

3.新建连接,输入你自己的ip,redis端口和密码,没有密码就不输入

4.连接成功

三.新建jedis项目

1.新建项目:右键→new→other→选择web下的Dynamic Web Project

2.这里项目名称为jedis

3.引入相关jar包,直接把依赖jar包复制到WEB-INF下的lib目录下

4.引入 junit:右键项目→properties-→ava build parh→Libraries→ADD Library→Junit→Finish

这里也可以直接引用junit包,我是用的myeclipse自带的

5.新建包com.redis.test   项目结构如下

 四.编写代码

这里直接贴出代码

1.redis.properties : redis连接配置文件

连接池配置参考:https://blog.csdn.net/wx5040257/article/details/78474157

#redis服务器ip
redis.ip=192.168.10.21
#redis服务器端口号
redis.port=6379
#redis密码
redis.passWord=
#与服务器建立连接的超时时间
redis.timeout=3000
#jedis的最大活跃连接数
pool.maxTotal=10
#jedis最大空闲连接数
pool.maxIdle=3
#jedis池没有连接对象返回时,等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
#如果超过等待时间,则直接抛出JedisConnectionException
pool.maxWaitMillis=3000

2.RedisPoolUtil : 连接池配置工具

这里使用单例模式+双重锁定写的一个redis连接池配置工具(如需xml配置连接池,自行百度,原理相同)

package com.redis.test;import java.util.Properties;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisConnectionException;/*** jedis连接池工具* @author corleone* @date 2018年11月27日*/
public class RedisPoolUtil {private volatile  static JedisPool jedisPool = null;private static String redisConfigFile = "redis.properties";//把redis连接对象放到本地线程中private static ThreadLocal<Jedis> local=new ThreadLocal<Jedis>();private RedisPoolUtil() {}/*** 初始化连接池* @author corleone* @date 2018年11月27日*/public static void initialPool() {try {Properties props = new Properties();//加载连接池配置文件props.load(RedisPoolUtil.class.getClassLoader().getResourceAsStream(redisConfigFile));// 创建jedis池配置实例JedisPoolConfig config = new JedisPoolConfig();// 设置池配置项值config.setMaxTotal(Integer.valueOf(props.getProperty("pool.maxTotal")));config.setMaxIdle(Integer.valueOf(props.getProperty("pool.maxIdle")));config.setMaxWaitMillis(Long.valueOf(props.getProperty("pool.maxWaitMillis")));// 根据配置实例化jedis池jedisPool = new JedisPool(config, props.getProperty("redis.ip"),Integer.valueOf(props.getProperty("redis.port")),Integer.valueOf(props.getProperty("redis.timeout")),"".equals(props.getProperty("redis.passWord"))?null:props.getProperty("redis.passWord"));System.out.println("连接池初始化成功");} catch (Exception e) {e.printStackTrace();System.err.println("连接池初始化失败");}}/*** 获取连接* @return * @author corleone* @date 2018年11月27日*/public static Jedis getInstance() { //Redis对象Jedis jedis =local.get();if(jedis==null){if (jedisPool == null) {    synchronized (RedisPoolUtil.class) {if (jedisPool == null) {initialPool(); }}}try{jedis = jedisPool.getResource();}catch(JedisConnectionException e){e.printStackTrace();}local.set(jedis);}return jedis;  }/*** 关闭连接* @author corleone* @date 2018年11月27日*/public static void closeConn(){Jedis jedis =local.get();if(jedis!=null){jedis.close();}local.set(null);}}

3.SerializeUtil : java序列化/反序列化封装工具

package com.redis.test;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;/*** java序列化/反序列化工具* @author corleone* @date 2018年11月27日*/
public class SerializeUtil {/*** 序列化* @param object* @author corleone* @date 2018年11月27日*/public static byte[] serizlize(Object object){ObjectOutputStream oos = null;ByteArrayOutputStream baos = null;try {baos = new ByteArrayOutputStream();oos = new ObjectOutputStream(baos);oos.writeObject(object);byte[] bytes = baos.toByteArray();return bytes;} catch (Exception e) {e.printStackTrace();}finally {try {if(baos != null){baos.close();}if (oos != null) {oos.close();}} catch (Exception e2) {e2.printStackTrace();}}return null;}/*** 反序列化* @param bytes* @author corleone* @date 2018年11月27日*/public static Object deserialize(byte[] bytes){ByteArrayInputStream bais = null;ObjectInputStream ois = null; try{bais = new ByteArrayInputStream(bytes);ois = new ObjectInputStream(bais);return ois.readObject();}catch(Exception e){e.printStackTrace();}finally {try {} catch (Exception e2) {e2.printStackTrace();}}return null;}
}

4.MapUtil : 对象与map相互转换封装工具

能够转换的对象需要该对象的属性必须是String或int类型,我这里只做演示,其他类型需要自己扩展

package com.redis.test;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;/*** java反射机制* 对象与map相互转换* @author corleone* @date 2018年11月14日*/
public class MapUtil {/*** map转对象(目前只支持对象中含有String和int类型的属性,其他类型需要自己扩展)* @param map* @param beanClass* @throws Exception * @author corleone* @date 2018年11月27日*/public static <T> Object mapToObject(Map<String, String> map, Class<?> beanClass)throws Exception {if (map == null)return null;Object obj = beanClass.newInstance();Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {int mod = field.getModifiers();if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {continue;}field.setAccessible(true);if(field.getType().equals(int.class)){field.set(obj, Integer.parseInt(map.get(field.getName())));}else{field.set(obj, (Object)map.get(field.getName()));}}return obj;}/*** 对象转map(目前只支持对象属性为基本类型)* @param obj* @throws Exception * @author corleone* @date 2018年11月27日*/public static Map<String, String> objectToMap(Object obj) throws Exception {if (obj == null) {return null;}Map<String, String> map = new HashMap<String, String>();Field[] declaredFields = obj.getClass().getDeclaredFields();for (Field field : declaredFields) {field.setAccessible(true);map.put(field.getName(), field.get(obj).toString());}return map;}}

5.ReflectUtil : 通过反射根据对象属性名称获取对应属性的值(在实际项目中用aop实现连接redis的时候有用到,本次演示没有用到该工具类,所以不贴出代码,有兴趣可以下载demo自己研究下:一.相关工具)

6.RedisOps : jedis存取常用数据封装工具类

这里写了String类型和hash类型两种数据存取,如需要存取其他数据类型可以自己扩展

package com.redis.test;import com.alibaba.fastjson.JSON;import redis.clients.jedis.Jedis;/*** redis存取工具类* @author corleone* @date 2018年11月15日*/
public class RedisOps {/*** kv字符串存* @param key* @param value * @author corleone* @date 2018年11月15日*/public static void set(String key,String value){Jedis jedis = RedisPoolUtil.getInstance();jedis.set(key, value);RedisPoolUtil.closeConn();}/*** kv字符串取* @param key* @return 字符串* @author corleone* @date 2018年11月15日*/public static String get(String key){Jedis jedis = RedisPoolUtil.getInstance();String value = jedis.get(key);RedisPoolUtil.closeConn();return value;}/*** kv对象存(java序列化方式)* @param key* @param object 对象类必须实现序列化* @author corleone* @date 2018年11月15日*/public static void setObjectSerialize(String key,Object object){Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return;}jedis.set(key.getBytes(), SerializeUtil.serizlize(object));RedisPoolUtil.closeConn();}/*** kv对象取(java反序列化)* @param key* @return 对象* @author corleone* @date 2018年11月15日*/public static Object getObjectSerialize(String key){Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return null;}byte[] bytes = jedis.get(key.getBytes());RedisPoolUtil.closeConn();if(bytes==null){return null;}return SerializeUtil.deserialize(bytes);}/*** 删除key* @param key * @author corleone* @date 2018年11月15日*/public static void del(String key){Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return;}jedis.del(key.getBytes());RedisPoolUtil.closeConn();}/*** kv对象存(json方式)* @param key* @param object * @author corleone* @date 2018年11月15日*/public static void setObjectJson(String key,Object object){Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return;}jedis.set(key, JSON.toJSONString(object));RedisPoolUtil.closeConn();}/*** kv对象取(json方式)* @param key* @param clazz反序列化对象类型* @return 对象* @author corleone* @date 2018年11月15日*/@SuppressWarnings({ "unchecked" })public static <T> Object getObjectJson(String key,Class<?> clazz){Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return null;}String result= jedis.get(key);RedisPoolUtil.closeConn();if(result==null){return null;}T obj=(T)JSON.parseObject(result,clazz);return obj;}/*** kv对象存(map形势)* @param key* @param u* @throws Exception * @author corleone* @date 2018年11月27日*/public static void setObjectHash(String key, Object u) throws Exception {Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return ;}jedis.hmset(key, MapUtil.objectToMap(u));RedisPoolUtil.closeConn();}/*** kv对象取(map形势)* @param key* @param clazz* @throws Exception * @author corleone* @date 2018年11月27日*/public static Object getObjectHash(String key,Class<?> clazz) throws Exception {Jedis jedis = RedisPoolUtil.getInstance();if(jedis==null){return null;}Object obj = MapUtil.mapToObject(jedis.hgetAll(key), clazz);RedisPoolUtil.closeConn();if(obj==null){return null;}return obj;}
}

7.User  Vehicle两个实体类  后者没有实现Serializable,不能用于java序列化存取

User

package com.redis.test;import java.io.Serializable;/*** 用户实体类* @author corleone* @date 2018年11月27日*/
public class User implements Serializable {private static final long serialVersionUID = -3210884885630038713L;private int id;private String name;private int age;public User(){}public User(int id,String name,int age){this.id = id;this.name = name;this.age=age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", age=" + age + "]";}}

Vehicle

package com.redis.test;/*** 车辆实体类* @author corleone* @date 2018年11月27日*/
public class Vehicle {private int id;private String platenumber;private String color;public Vehicle(){}public int getId() {return id;}public Vehicle(int id, String platenumber, String color) {this.id = id;this.platenumber = platenumber;this.color = color;}public void setId(int id) {this.id = id;}public String getPlatenumber() {return platenumber;}public void setPlatenumber(String platenumber) {this.platenumber = platenumber;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "Vehicle [id=" + id + ", platenumber=" + platenumber+ ", color=" + color + "]";}}

8.JTest : jedis存取数据测试类

package com.redis.test;import org.junit.Test;import redis.clients.jedis.Jedis;/*** jedis存取测试* @author corleone* @date 2018年11月27日*/
public class JTest {/*** 测试连接* @author corleone* @date 2018年11月27日*/@Testpublic void TestPing(){Jedis jedis = RedisPoolUtil.getInstance();System.out.println(jedis.ping());}/*** 测试java序列化存取* @author corleone* @date 2018年11月27日*/@Testpublic void TestSerialize(){User u = new User(1,"小明",6);RedisOps.setObjectSerialize(User.class.getName().toString()+":"+1, u);User u2 = (User)RedisOps.getObjectSerialize(User.class.getName().toString()+":"+1);System.out.println(u2.toString());}/***  测试json序列化存取* @author corleone* @date 2018年11月27日*/@Testpublic void TestJson(){User u = new User(1,"小明",6);Vehicle v = new Vehicle(1,"渝A00000","蓝色");RedisOps.setObjectJson(User.class.getName().toString()+":"+1, u);RedisOps.setObjectJson(Vehicle.class.getName().toString()+":"+1, v);User u2 = (User)RedisOps.<User>getObjectJson(User.class.getName().toString()+":"+1,User.class);Vehicle v2 = (Vehicle)RedisOps.<Vehicle>getObjectJson(Vehicle.class.getName().toString()+":"+1,Vehicle.class);System.out.println(u2.toString());System.out.println(v2.toString());}/*** 测试hash存取* @throws Exception * @author corleone* @date 2018年11月27日*/@Testpublic void TestHash() throws Exception{Vehicle v = new Vehicle(1,"渝A00000","蓝色");RedisOps.setObjectHash(Vehicle.class.getName().toString()+":"+1, v);Vehicle v2=(Vehicle) RedisOps.getObjectHash(Vehicle.class.getName().toString()+":"+1,Vehicle.class);System.out.println(v2.toString());}}

五.连接测试

这里以json序列化存取对象为例

1.执行TestJson方法成功

2.查看redis中的数据

六.注意事项

这里都是踩坑过来的,把我遇到过的问题也贴出来

1.外部无法连接:一般是linux防火墙未关闭的原因,这里特别注意centos7关闭防火墙与之前版本不一样,如果你用的centos7,那么请整对centos7进行百度

2.如果你的redis没有密码,请不要输入空字符串

3.java序列化存取对象,记得实现Serializable

4.如果你的实体类添加了有参构造方法,请重写无参构造方法,否则报如下错误

后续贴出springAOP实现redis连接,以及本人在实际业务中的存取方式,如有不足感谢指出!

java连接redis存取数据(详细)相关推荐

  1. java 连接redis失败_java 连接Redis问题及demo

    java连接linux Redis遇到的问题 昨天在Linux搭建了Redis服务,今天使用java连接测试了一下.要想使用java连接redis服务,就离不开jedis-2.6.1.jar.使用je ...

  2. Java连接Redis及操作(二)

    前言 上一节我们学习了java连接Redis,并且连接Redis成功,今天博主带领大家进行简单的操作Redis.要想对Redis进行Java的操作,必须先了解Redis API(点击这里),可看到AP ...

  3. Java连接Redis及操作(一)

    Redis简介 Redis是一个开源的使用ANSI c语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它是一种非关系性的数据库.它是以key-val ...

  4. Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例

    学习目标 redis 概念 下载安装 命令操作 1. 数据结构 持久化操作 使用Java客户端操作redis Redis 前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念: redis是 ...

  5. Redis——Java连接Redis

    Java连接redis,首先修改两项配置文件 bind 127.0.0.1 ::1 注释掉 protected-mode 设置为no 然后需要导入一个依赖 <!--redis--> < ...

  6. Redis集群搭建及java连接redis

    Redis集群搭建及java连接redis Redis集群分为三种: 1.主从关系模式2.Sentinel哨兵关系模式3.Cluster去中心化模式 1.主从关系模式 1.1.什么是主从模式? (1) ...

  7. Java连接Redis

    Java连接Redis Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对redis各类API进行封装调用. 引入jar包 我创建的是maven项目,所以只用在pom ...

  8. Java连接redis选择指定库操作

    redis建立好通常会有15个库,从db0-db15,但是Java操作redis的时候,需要通过jedis连接,默认连接的是db0号库,如果需要往其他号库进行操作,执行以下操作就可以啦. 以maven ...

  9. Java连接mysql数据库的详细教程(增查)

    java连接mysql数据库[便于理解的jdbc] 一.开发环境 二.创建数据表 1. 用Navicat图形化创建 2. 用命令行创建 三.创建java工程 1.在eclipse中创建一个工程:Fir ...

最新文章

  1. c# winform做简单的折线图(VS2017)
  2. logitech g hub一直在初始化_Wi-Fi中“2.4G”和“5G”的那些事儿
  3. lambda也是python_Python lambda介绍
  4. An internal error occurred during: “AppXray Indexing
  5. 【已解决】CMake Error: Cannot determine link language for target “xxx“. CMake Error: CMake can not determ
  6. zookeeper 源码阅读(2)
  7. 【LeetCode笔记】142. 环形链表 II(Java、快慢指针)
  8. 华为Mate 50系列明年初发布:麒麟990/骁龙8 Gen1加持
  9. 实验二 php基本语法1,实验二PHP基础.doc
  10. Windows workflow foundation之旅(三)——指南2(创建状态机工作流)(上)
  11. 5G 时代,一加的机会在哪里?
  12. 怎么用python处理word和excel_python处理word和excel文件
  13. 【STM32】Keil v5下载与安装
  14. JAVA毕业设计高校教学资源共享平台计算机源码+lw文档+系统+调试部署+数据库
  15. BT5的默认用户名和密码
  16. 学习 UML 核心元素
  17. 良仓远行 · 硅谷遇上西雅图,同游招募
  18. 不填写内容用哪个斜杠代替_手写斜杠日期怎么写
  19. Sprint(第二天11.15)
  20. js——获取data-id 的值

热门文章

  1. 父母不会用智能机?这几个功能可要教会他们
  2. 怎么导出微信语音【亲测有效】
  3. 短视频处理LanSoEditor-SDK之抠图和动画设计
  4. Retrying connect to server: 192.168.10.101/192.168.10.101:10020. Already tried 0 time(s); retry poli
  5. 发那科机器人GI分配_发那科机器人应用-运动指令入门(1)
  6. Apollo6.0_ReferenceLine_Smoother解析与子方法对比
  7. 怎么用c语言让电脑定时开关机,台式电脑定时开机怎么设置(怎么让电脑定时开机开关机)...
  8. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...
  9. __rept__和__str__
  10. 关于html中的图片居中问题