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
文件中對JedisPool進行配置
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