redis連線池及常用API封裝
阿新 • • 發佈:2019-02-16
前言
之前就有文章提到了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後。如果你看到這篇文章,千里之外,我在等你聯絡。