redis 連線池
https://blog.csdn.net/wx5040257/article/details/78474157
環境:jdk1.7 redis3.2.8
所需jar包:jedis-2.9.0.jar commons-pool2-2.3
Jedis連線池使用步驟如下:
1->獲取Jedis例項需要從JedisPool中獲取;
2->用完Jedis例項需要返還給JedisPool;
3->如果Jedis在使用過程中出錯,則也需要還給JedisPool;
=================連線池引數配置檔案redis.properties================
#*****************jedis連線引數設定*********************
#redis伺服器ip
redis.ip=169.254.130.122
#redis伺服器埠號
redis.port=6379
#redis訪問密碼
redis.passWord=test123
#與伺服器建立連線的超時時間
redis.timeout=3000
#************************jedis池引數設定*******************
#jedis的最大活躍連線數
jedis.pool.maxActive=100
#jedis最大空閒連線數
jedis.pool.maxIdle=50
#jedis池沒有連線物件返回時,等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。
#如果超過等待時間,則直接丟擲JedisConnectionException
jedis.pool.maxWait=1500
#從池中獲取連線的時候,是否進行有效檢查
jedis.pool.testOnBorrow=true
#歸還連線的時候,是否進行有效檢查
jedis.pool.testOnReturn=true
=================Redis連線池工具類RedisPoolUtil================
package com.wx.utils;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Redis連線池工具類
*/
public class RedisPoolUtil {
private static JedisPool jedisPool = null;
private static String redisConfigFile = "redis.properties";
//把redis連線物件放到本地執行緒中
private static ThreadLocal<Jedis> local=new ThreadLocal<Jedis>();
//不允許通過new建立該類的例項
private RedisPoolUtil() {
}
/**
* 初始化Redis連線池
*/
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("jedis.pool.maxActive")));
config.setMaxIdle(Integer.valueOf(props.getProperty("jedis.pool.maxIdle")));
config.setMaxWaitMillis(Long.valueOf(props.getProperty("jedis.pool.maxWait")));
config.setTestOnBorrow(Boolean.valueOf(props.getProperty("jedis.pool.testOnBorrow")));
config.setTestOnReturn(Boolean.valueOf(props.getProperty("jedis.pool.testOnReturn")));
// 根據配置例項化jedis池
jedisPool = new JedisPool(config, props.getProperty("redis.ip"),
Integer.valueOf(props.getProperty("redis.port")),
Integer.valueOf(props.getProperty("redis.timeout")),
props.getProperty("redis.passWord"));
System.out.println("執行緒池被成功初始化");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲得連線
* @return Jedis
*/
public static Jedis getConn() {
//Redis物件
Jedis jedis =local.get();
if(jedis==null){
if (jedisPool == null) {
initialPool();
}
jedis = jedisPool.getResource();
local.set(jedis);
}
return jedis;
}
//新版本用close歸還連線
public static void closeConn(){
//從本地執行緒中獲取
Jedis jedis =local.get();
if(jedis!=null){
jedis.close();
}
local.set(null);
}
//關閉池
public static void closePool(){
if(jedisPool!=null){
jedisPool.close();
}
}
}
============執行緒測試類============
package com.wx.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.wx.utils.RedisPoolUtil;
import redis.clients.jedis.Jedis;
public class TestPool {
public static void main(String[] args) {
//初始化連線池
RedisPoolUtil.initialPool();
//啟動1000個執行緒
for (int i = 0; i < 1000; i++) {
ClientThread t = new ClientThread(i);
t.start();
}
}
}
//執行緒類
class ClientThread extends Thread {
int i = 0;
public ClientThread(int i) {
this.i = i;
}
public void run() {
Jedis jedis=RedisPoolUtil.getConn();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String time = sdf.format(date);
jedis.set("key"+i, time);
try {
//每次睡眠一個隨機時間
Thread.sleep((int)(Math.random()*5000));
String foo = jedis.get("key"+i);
System.out.println("【輸出>>>>】key:" + foo + " 第:"+i+"個執行緒");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
RedisPoolUtil.closeConn();
}
}
}
執行過程中,去伺服器看連線數
127.0.0.1:6379> info clients
# Clients
connected_clients:102
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> info clients
# Clients
connected_clients:70
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> info clients
# Clients
connected_clients:53
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379>
可以看出連線池中最大100個活躍連線迅速被佔滿,(最開始102個是因為我單獨啟動了兩個連線)
然後連線用完了,迅速歸還連線
java端的執行結果
可以看出有超時沒拿到連線的報錯!
ok,測試成功!
---------------------
作者:御前兩把刀刀
來源:CSDN
原文:https://blog.csdn.net/wx5040257/article/details/78474157
版權宣告:本文為博主原創文章,轉載請附上博文連結!