Spring中使用Jedis操作redis
阿新 • • 發佈:2020-08-09
13Spring中使用Jedis操作redis
Redis是一款開源的記憶體KV儲存,相比較於membercached只有一種資料結構,redis支援多種資料結構。
Spring對Redis的支援
Spring中通過Spring Data Redis這個模組實現對Redis的支援。操作Redis的方式有以下幾種:
- 支援的客戶端 Jedis / Lettuce
- RedisTemplate
- Repository支援
Jedis客戶端的簡單使用
- Jedis的例項不是執行緒安全的,也就是在多執行緒場景下,不能使用同一個Jedis例項。
- 通過JedisPool中維護Jedis例項,當需要使用的時候從JedisPool中獲取Jedis例項。
- 獲取到Jedis例項之後進行對應業務方法的呼叫
talk is easy ,show me the code
引入Jedis依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
配置建立JedisPoolConfig
由於Jedis例項非執行緒安全,所以使用JedisPool來建立維護Jedis。先在application.properties
redis.host=localhost
#連線池的最大資料庫連線數 。設為0表示無限制,如果是jedis 2.4以後用redis.maxTotal ,在這之前使用maxActive
redis.maxTotal=5
#控制一個pool最多有多少個狀態為空閒(idle)的jedis例項
redis.maxIdle=5
#在呼叫(borrow)一個jedis例項時,是否提前進行驗證操作,如果為true,則得到的jedis例項均是可用的
redis.testOnBorrow=true
使用JedisPool的配置,建立JedisPoolConfig
這個Bean
@Bean @ConfigurationProperties("redis") public JedisPoolConfig jedisPoolConfig() { return new JedisPoolConfig(); }
同樣的,為什麼是使用maxTotal、maxIdle、testOnBorrow這幾個欄位,而不是其他的其他名稱的欄位。首先字首redis
是我們自己定義的,這個是可以修改的,這個就不多說了。
上圖是JedisPoolconfig的類關係圖,其父類中定義了maxTotal、maxIdle等欄位。至於testOnBorrow這個欄位名是在GenericObjectPoolConfig的父類BaseObjectPoolConfig中定義的。
配置建立JedisPool
@Bean(destroyMethod = "close")
public JedisPool jedisPool(@Value("${redis.host}") String host) {
return new JedisPool(jedisPoolConfig(), host);
}
使用自定義的JedisPoolConfig 並傳入host資訊,來完成JedisPool的建立。
使用Jedis例項操作Redis
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("name", "張三");
log.info("redis value:{}", jedis.get("name"));
}
- 首先通過JedisPool獲取Jedis例項
- 通過Jedis例項提供的API進行資料的存取
常用Util
public class RedisPool {
//Redis伺服器IP
private static String ADDR = "127.0.0.1";
//Redis的埠號
private static int PORT = 6379;
//訪問密碼
private static String AUTH = "123456";
//可用連線例項的最大數目,預設值為8;
//如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis例項,則此時pool的狀態為exhausted(耗盡)。
private static int MAX_ACTIVE = 1024;
//控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項,預設值也是8。
private static int MAX_IDLE = 200;
//等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接丟擲JedisConnectionException;
private static int MAX_WAIT = 10000;
private static int TIMEOUT = 10000;
//在borrow一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis連線池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
// config.setMaxActive(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
// config.setMaxWait(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取Jedis例項
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
更多配置資訊
#ip地址
redis.hostName=172.20.1.205
#埠號
redis.port=6379
#如果有密碼
redis.password=123456
#客戶端超時時間單位是毫秒 預設是2000
redis.timeout=10000
#最大空閒數
redis.maxIdle=300
#連線池的最大資料庫連線數。設為0表示無限制,如果是jedis 2.4以後用redis.maxTotal
#redis.maxActive=600
#控制一個pool可分配多少個jedis例項,用來替換上面的redis.maxActive,如果是jedis 2.4以後用該屬性
redis.maxTotal=1000
#最大建立連線等待時間。如果超過此時間將接到異常。設為-1表示無限制。
redis.maxWaitMillis=1000
#連線的最小空閒時間 預設1800000毫秒(30分鐘)
redis.minEvictableIdleTimeMillis=300000
#每次釋放連線的最大數目,預設3
redis.numTestsPerEvictionRun=1024
#逐出掃描的時間間隔(毫秒) 如果為負數,則不執行逐出執行緒, 預設-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個
redis.testOnBorrow=true
#在空閒時檢查有效性, 預設false
redis.testWhileIdle=true