依赖jar包
- redis连接工具jedis
- jedis连接池commons-pool
- 阿里的json序列化工具fastjson
- 单元测试junit
<!--redis连接工具-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<!--jedis连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
<!--阿里的json序列化工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
主要代码
- redis连接配置文件redis.properties
#redis服务器ip
redis.ip=127.0.0.1
#redis服务器端口号
redis.port=6379
#redis密码
redis.passWord=
#与服务器建立连接的超时时间
redis.timeout=3000
#jedis的最大活跃连接数
pool.maxTotal=10
#jedis最大空闲连接数
pool.maxIdle=3
#jedis池没有连接对象返回时,等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
#如果超过等待时间,则直接抛出JedisConnectionException
pool.maxWaitMillis=3000
- 连接池配置工具RedisPoolUtil
使用单例模式+双重锁定写的redis连接池配置工具
package com.robert.mpdt.redis;
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连接池工具
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() {
}
// 初始化连接池
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("连接池初始化失败");
}
}
// 获取连接
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;
}
// 关闭连接
public static void closeConn(){
Jedis jedis =local.get();
if(jedis!=null){
jedis.close();
}
local.set(null);
}
}
- java序列化/反序列化封装工具SerializeUtil
package com.robert.mpdt.redis;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
// java序列化/反序列化工具
public class SerializeUtil {
// 序列化
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;
}
// 反序列化
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;
}
}
- 对象与map相互转换封装工具MapUtil
下面工具能够转换的对象需要该对象的属性必须是String或int类型
package com.robert.mpdt.redis;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
// java反射机制
public class MapUtil {
// map转对象(目前只支持对象中含有String和int类型的属性,其他类型需要自己扩展)
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(目前只支持对象属性为基本类型)
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;
}
}
- jedis存取常用数据封装工具类RedisOps
实现了String类型和hash类型两种数据存取
package com.robert.mpdt.redis;
import com.alibaba.fastjson.JSON;
import redis.clients.jedis.Jedis;
// redis存取工具类
public class RedisOps {
// kv字符串存
public static void set(String key,String value){
Jedis jedis = RedisPoolUtil.getInstance();
jedis.set(key, value);
RedisPoolUtil.closeConn();
}
// kv字符串取
public static String get(String key){
Jedis jedis = RedisPoolUtil.getInstance();
String value = jedis.get(key);
RedisPoolUtil.closeConn();
return value;
}
// kv对象存(java序列化方式)
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反序列化)
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
public static void del(String key){
Jedis jedis = RedisPoolUtil.getInstance();
if(jedis==null){
return;
}
jedis.del(key.getBytes());
RedisPoolUtil.closeConn();
}
// kv对象存(json方式)
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方式)
@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形式)
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形式)
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;
}
}
- 两个实体类User和Vehicle
Vehicle类没有实现Serializable接口,不能用于java序列化存取
User
package com.robert.mpdt.redis;
import java.io.Serializable;
// 用户实体类
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;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Vehicle
package com.robert.mpdt.redis;
// 车辆实体类
public class Vehicle {
private int id;
private String platenumber;
private String color;
public Vehicle(){
}
public Vehicle(int id, String platenumber, String color) {
this.id = id;
this.platenumber = platenumber;
this.color = color;
}
public int getId() {
return id;
}
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;
}
@Override
public String toString() {
return "Vehicle [id=" + id + ", platenumber=" + platenumber
+ ", color=" + color + "]";
}
}
- jedis存取数据测试类JTest
package com.robert.mpdt.redis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
// jedis存取测试
public class JTest {
// 测试连接
@Test
public void TestPing(){
Jedis jedis = RedisPoolUtil.getInstance();
System.out.println(jedis.ping());
}
// 测试java序列化存取
@Test
public 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序列化存取
@Test
public 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存取
@Test
public void TestHash() throws Exception{
Vehicle v = new Vehicle(1,"渝A00000","蓝色");
RedisOps.setObjectHash(Vehicle.class.getName(), v);
Vehicle v2=(Vehicle) RedisOps.getObjectHash(Vehicle.class.getName(),Vehicle.class);
System.out.println(v2.toString());
}
}
本文主要参考自java连接redis存取数据(详细)
实际开发中使用SpringBoot整合Redis,更加方便和简单。