Java连接Redis存储数据

依赖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>

主要代码

  1. 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
  1. 连接池配置工具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);
    }

}
  1. 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;
    }
}
  1. 对象与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;
    }

}
  1. 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;
    }
}
  1. 两个实体类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 + "]";
    }
}
  1. 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,更加方便和简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值