Jedis 連接池的基本使用


jedis直連

每次操作都會創建一個jedis對象,執行完畢后關閉連接后釋放,對應的就是一次Tcp連接。

img

jedis連接池

預先生成一批jedis連接對象放入連接池中,當需要對redis進行操作時從連接池中借用jedis對象,操作完成后歸還。這樣jedis對象可以重復使用,避免了頻繁創建socket連接,節省了連接開銷。

img

方案對比

img

連接池簡單使用

public class Demo {
    
    public static void main(String[] args) {
        //連接池配置對象,包含了很多默認配置
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        //初始化Jedis連接池,通常來講JedisPool是單例的
        JedisPool jedisPool = new JedisPool(poolConfig, "119.23.226.29", 6379);
        Jedis jedis = null;
        try {
            //1.從連接池獲取jedis對象
            jedis = jedisPool.getResource();
            //2.執行操作
            jedis.set("hello", "jedis");
            System.out.println(jedis.get("hello"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            //如果使用JedisPool,那么close操作不是關閉連接,代表歸還連接池
            if(jedis != null){
                jedis.close();
            }
        }   
    }
}

連接池封裝使用

public class RedisPool {
    //jedis連接池,使用static保證連接池在tomcat啟動時就加載出來
    private static JedisPool pool;
    //連接池中的最大連接數
    private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total", "20"));
    //連接池中的最大空閑連接數
    private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle", "20"));
    //連接池中的最小空閑連接數
    private static Integer minIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle", "0"));

    //借用連接時是否進行驗證
    private static Boolean testOnBorrow = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow", "true"));
    //返還連接時是否進行驗證
    private static Boolean testOnReturn = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return", "true"));

    private static String redisIp = PropertiesUtil.getProperty("redis.ip");
    private static Integer redisPort = Integer.parseInt(PropertiesUtil.getProperty("redis.port"));
    private static String password = PropertiesUtil.getProperty("redis.password");

    //初始化連接池,只會調用一次
    private static void initPool() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        config.setTestOnBorrow(testOnBorrow);
        config.setTestOnReturn(testOnReturn);
        //連接池耗盡的時候,是否阻塞,false會拋出異常,true會阻塞直到超時拋出異常,默認為true
        config.setBlockWhenExhausted(true);
        //超時時間2s
        pool = new JedisPool(config, redisIp, redisPort, 1000*2, password);
    }

    static {
        initPool();
    }

    //從連接池中借用一個實例
    public static Jedis getJedis() {
        return pool.getResource();
    }
}
public class RedisPoolUtil {
    public static String set(String key, String value) {
        Jedis jedis = null;
        String result = null;
        try {
            jedis = RedisPool.getJedis();
            result = jedis.set(key, value);
        } catch (Exception e) {
            log.error("set key:{} value:{} error", key, value, e);
        } finally {
            shutdown(jedis);
        }
        return result;
    }
    
    public static void shutdown(Jedis jedis) {
        if (null != jedis) {
            // close會判斷連接是否破損而執行對應的回收操作
            jedis.close();
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM