1. 程式人生 > >redis連線池及常用API封裝

redis連線池及常用API封裝

前言

之前就有文章提到了redis如何安裝redis和簡單使用 但是在這裡就不是簡單的使用了。而是封裝自己的redis連線池,同時使用Jedis封裝操作redis的API。

注意:以下使用的@Slf4j註解為lombok工具及其依賴。如果沒有使用lombok只需要將其刪掉,重新在類中定義日誌即可。也可以將所有日誌列印刪掉。

Redis連線池

首先直接將Redis連線池拿上來吧。


/**
 * Jedis連線Redis的連線池
 *
 * @author : ChenCong
 * @date : Created in 17:22 2018/3/2
 */
public
class RedisPool { /** * jedis 連線池 */ private static JedisPool pool; /** * 最大連線數 */ private static Integer maxTotal = PropertiesUtil.getIntegerProperty("redis.max.total", 20); /** * 在jedisPool中最大idle狀態(空閒) */ private static Integer maxIdle = PropertiesUtil.getIntegerProperty("redis.max.idle"
, 10); /** * 在jedisPool當中最小的idle狀態(空閒) */ private static Integer minIdle = PropertiesUtil.getIntegerProperty("redis.min.idle", 2); /** * 在Borrow一個jedis例項的時候是否進行驗證操作。 * 如果賦值為true,則拿到的jedis是可用的 */ private static Boolean testOnBorrow = PropertiesUtil.getBooleanProperty("redis.test.borrow"
, true); /** * 在return一個jedis例項時候,是否要進行測試, * 如果賦值為true時,則放回的jedis例項為可用的 */ private static Boolean testOnReturn = PropertiesUtil.getBooleanProperty("redis.test.return", true); /** * 獲取RedisIP */ private static String redisIp = PropertiesUtil.getProperty("redis.ip"); /** * 獲取RedisPort */ private static Integer redisPort = PropertiesUtil.getIntegerProperty("redis.port"); /** * 初始化JedisPoolConfig連線池 */ 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); pool = new JedisPool(config, redisIp, redisPort, 1000 * 2); } /* * 初始化Jedis連線池 */ static { initPool(); } /** * 獲取jedis連線 * * @return jedis */ public static Jedis getJedis() { return pool.getResource(); } /** * 放回jedis * * @param jedis jedis */ public static void returnBrokenResource(Jedis jedis) { pool.returnBrokenResource(jedis); } /** * 放回jedis * * @param jedis jedis */ public static void returnResource(Jedis jedis) { pool.returnResource(jedis); } public static void main(String[] args) { Jedis jedis = pool.getResource(); jedis.set("chencongKey","chencongValue"); returnResource(jedis); /*獲取值*/ System.out.println(jedis.get("chencongKey")); /* * 臨時呼叫,銷燬連線池中所有連線 */ pool.destroy(); System.out.println("program is end"); } }

關於PropertiesUtil這個工具類只是獲取*.properties配置檔案的引數的封裝類而已。哦,對了,關於redis的各項配置檔案如下:

# jedis 連線redis 時的配置檔案
# redis config start

# redis ip
redis.ip=127.0.0.1

# redis port
redis.port=6379
# 最大連線數
redis.max.total=20

# 最大空閒數
redis.max.idle=10

# 最小空閒數
redis.min.idle=2

# 從jedis連線池當中獲取連線時,檢驗並返回可用的連線
redis.test.borrow=true

# 將連線放回jedis連線池時,檢驗並返回可用的連線
redis.test.return=false

# redis config end

關於PropertiesUtil中的方法都有過載,一:直接通過key獲取引數值,二:當key對應引數值不存在時,給予預設值。

/**
 * 最大連線數
 */
private static Integer maxTotal = PropertiesUtil.getIntegerProperty("redis.max.total", 20);

這個獲取最大連線數的redis.max.total為key,20為預設值。如果redis.max.total對應的配置檔案值不為null則返回其值,否則返回預設值20.

如果不太清楚如何獲取*.properties配置檔案。我還是將這個工具類放上來。

PropertiesUtil

/**
 * 讀取properties配置檔案的工具類<br>
 * 2018年3月10日21:44:34 新增獲取Boolean int型別的方法及其過載方法
 *
 * @author chencong
 */
public class PropertiesUtil {

    /**
     * 讀取日誌
     */
    private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);

    /**
     * properties屬性
     */
    private static Properties props;

    /*
     * 靜態程式碼塊讀取制定配置檔案
     */
    static {
        /*
         * 應為使用了maven環境隔離,編譯之後都存在於src下面,因此這裡使用指明讀取的是哪一個配置檔案就行了<br>
         * 切記不要使用這種:src/resources.dev/data.properties 會出現異常
         * 直接指明配置檔案就行了
         */
        String fileName = "data.properties";
        props = new Properties();
        try {
            props.load(
                    new InputStreamReader(
                            PropertiesUtil.class
                                    .getClassLoader().
                                    getResourceAsStream(fileName), "UTF-8"));
        } catch (IOException e) {
            logger.error("配置檔案讀取異常", e);
        }
    }

    /**
     * 獲取配置檔案當中key所對應值
     *
     * @param key key
     * @return 返回key所對應的值,存在則返回,不存在則返回null
     */
    public static String getProperty(String key) {
        String value = props.getProperty(key.trim());
        if (StringUtils.isBlank(value)) {
            return null;
        }
        return value.trim();
    }

    /**
     * 獲取配置檔案當中key所對應的值,同時給予預設值。<br>
     * 當key所對應的值不存在時,返回引數當中給予的預設值
     *
     * @param key          key
     * @param defaultValue 預設值
     * @return 返回key對應值,不存在或者為null時返回預設值defaultValue
     */
    public static String getProperty(String key, String defaultValue) {
        String value = props.getProperty(key.trim());
        if (StringUtils.isBlank(value)) {
            value = defaultValue;
        }
        return value.trim();
    }

    /**
     * 獲取配置檔案當中key所對應值,存在則進行數字轉換。將其返回
     *
     * @param key key
     * @return 返回key對應的值,不存在或發生NumberFormatException則返回null
     */
    public static Integer getIntegerProperty(String key) {
        String value = props.getProperty(key.trim());
        Integer result;
        try {
            result = Integer.parseInt(value);
        } catch (NumberFormatException e) {
            logger.info("引數轉換異常:" + e.getMessage());
            return null;
        }
        return result;
    }

    /**
     * 獲取配置檔案當中key所對應值,存在則進行數字轉換。將其返回
     *
     * @param key          key
     * @param defaultValue 預設值
     * @return 返回key對應的值,不存在時或發生NumberFormatException則返回defaultValue
     */
    public static Integer getIntegerProperty(String key, Integer defaultValue) {
        String value = props.getProperty(key);
        Integer result;
        if (StringUtils.isBlank(value)) {
            result = defaultValue;
            return  result;
        }
        try {
            result = Integer.parseInt(value);
        } catch (NumberFormatException e) {
            logger.info("引數轉換異常:" + e.getMessage());
            result = defaultValue;
        }
        return result;
    }

    /**
     * 獲取配置檔案當中key所對應值<br>
     * 如果其值為true則返回true,false或其他值則返回false,為空時返回null
     *
     * @param key key
     * @return key對應的值,值為true時返回true,false或其他值則返回false
     */
    public static Boolean getBooleanProperty(String key) {
        String value = props.getProperty(key.trim()).trim();
        Boolean result;
        if (StringUtils.isBlank(value)) {
            return null;
        }
        result = "true".equals(value);
        return result;
    }

    /**
     * 獲取配置檔案當中key所對應值<br>
     * 如果其值為true則返回true,false或其他值則返回false,為null時返回defaultValue
     *
     * @param key          key
     * @param defaultValue 預設值
     * @return key對應的值,值為true時返回true,false或其他值則返回false
     */
    public static Boolean getBooleanProperty(String key, Boolean defaultValue) {
        String value = props.getProperty(key.trim()).trim();
        Boolean result;
        if (StringUtils.isBlank(value)) {
            result = defaultValue;
            return  result;
        }
        result = "true".equals(value);
        return result;
    }
}

RedisPoolUtil工具類

直接上工具類

/**
 * redisPoolUtil工具類
 *
 * @author chencong
 */
@Slf4j
public class RedisPoolUtil {
    /**
     * jedis set方法,通過設定值過期時間exTime,單位:秒<br>
     * 為後期session伺服器共享,Redis儲存使用者session所準備
     *
     * @param key    key
     * @param value  value
     * @param exTime 過期時間,單位:秒
     * @return 執行成功則返回result 否則返回null
     */
    public static String setEx(String key, String value, int exTime) {
        Jedis jedis = null;
        String result = null;
        try {
            jedis = RedisPool.getJedis();
            result = jedis.setex(key, exTime, value);
        } catch (Exception e) {
            log.error("set key:{} value{} error", key, value, e);
            RedisPool.returnBrokenResource(jedis);
            return result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }

    /**
     * 對key所對應的值進行重置過期時間expire
     *
     * @param key    key
     * @param exTime 過期時間 單位:秒
     * @return 返回重置結果, 1:時間已經被重置,0:時間未被重置
     */
    public static Long expire(String key, int exTime) {
        Jedis jedis = null;
        Long result = null;
        try {
            jedis = RedisPool.getJedis();
            result = jedis.expire(key, exTime);
        } catch (Exception e) {
            log.error("expire key:{} error ", key, e);
            RedisPool.returnBrokenResource(jedis);
            return result;
        }
        RedisPool.returnResource(jedis);
        return result;

    }

    /**
     * jedis set方法
     *
     * @param key   key
     * @param value value
     * @return 執行成功則返回result,否則返回null
     */
    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);
            RedisPool.returnBrokenResource(jedis);
            return result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }

    /**
     * jedis get方法
     *
     * @param key key
     * @return 返回key對應的value 異常則返回null
     */
    public static String get(String key) {
        Jedis jedis = null;
        String result = null;
        try {
            jedis = RedisPool.getJedis();
            result = jedis.get(key);
        } catch (Exception e) {
            log.error("set key:{}error", key, e);
            RedisPool.returnBrokenResource(jedis);
            return result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }

    /**
     * jedis 刪除方法
     *
     * @param key key
     * @return 返回結果,異常返回null
     */
    public static Long del(String key) {
        Jedis jedis = null;
        Long result = null;
        try {
            jedis = RedisPool.getJedis();
            result = jedis.del(key);
        } catch (Exception e) {
            log.error("del key:{} error", key, e);
            RedisPool.returnBrokenResource(jedis);
            return result;
        }
        return result;
    }

    /**
     * xxxx描述資訊
     *
     * @param args 引數
     */
    public static void main(String[] args) {
        Jedis jedis = RedisPool.getJedis();
        RedisPoolUtil.set("keyTest", "keyValue");

        String value = RedisPoolUtil.get("keyTest");

        RedisPoolUtil.setEx("keyEx", "valueEx", 60 * 10);

        RedisPoolUtil.expire("keyTest", 60 * 20);

    }
}

redis操作當中的set get setEx del方法都已很明確。各方法的文件註釋都很明瞭清晰。

聯絡

聰聰的獨立部落格 ,一個喜歡技術,喜歡鑽研的95後。如果你看到這篇文章,千里之外,我在等你聯絡。