JedisPool 工具类(DCL 思想)

1、工具类代码

package com.yanghui;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author YH
 * DCL 懒汉式
 * 1、确保一个类只有一个实例对象
 * 2、一个私有静态变量(实例对象)
 * 3、一个公共静态方法(获取实例对象的方法)
 */
public class JedisPoolUtil {
    /** volatile 保证 内存可见性 */
    private static volatile JedisPool jedisPool = null;

    /** 构造器私有 */
    private JedisPoolUtil() { }

    /** 获取 JedisPool 的实例对象方法*/
    public static JedisPool getJedisPoolInstance() {
        /**
         * 如果 jedisPoll 为 null,说明 jedisPool 还没有实例对象
         */
        if (jedisPool == null) {
            /**
             * 加锁,防止多线程下争抢资源,同时 new 出多个实例对象
             */
            synchronized (JedisPoolUtil.class) {
                /**
                 * 再判断一次 jedisPool 是否真的为 null
                 * 以防在加锁的时候已经有线程 new 了一个实例对象了
                 */
                if (jedisPool == null) {
                    /** 这个类可以对连接池进行配置,如最大连接数等 */
                    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                    /** 设置 JedisPool 最大连接数 */
                    jedisPoolConfig.setMaxTotal(10);
                    
                    jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
                }
            }
        }

        /** 返回 JedisPool 实例 */
        return jedisPool;
    }

    /**
     * 释放资源
     */
    public static void release(JedisPool jedisPool, Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}




2、测试工具类

(1)测试代码

package com.yanghui;

import redis.clients.jedis.JedisPool;

/**
 * @author YH
 */
public class JedisPoolTest {
    public static void main(String[] args) {
        JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
        JedisPool jedisPool1 = JedisPoolUtil.getJedisPoolInstance();
        System.out.println("====测试两个类实例是否一致====");
        System.out.println(jedisPool == jedisPool1);
    }
}


(2)运行结果

JedisPool 工具类(DCL 思想)




3、开始使用

(1)示例代码

package com.yanghui;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * @author YH
 */
public class JedisPoolTest {
    public static void main(String[] args) {
        JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
        Jedis jedis = null;

        try {
            /** 从连接池中获取资源 */
            jedis = jedisPool.getResource();
            /** 现在就可以开始使用了 */   
            jedis.set("k1", "v1");
            System.out.println(jedis.get("k1"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            /** 释放资源 */
            JedisPoolUtil.release(jedis);
        }
    }
}

(2)运行截图

JedisPool 工具类(DCL 思想)

上一篇:清理线上Redis没有设置过期时间的key


下一篇:Redis基础学习 跟 Jedis 的手动实现