酷知百科網

位置:首頁 > 遊戲數碼 > IT技術

Spring Boot如何整合Redis

IT技術2.09W

Spring Boot是目前非常流行的Java Web開發框架,Redis是非關係型數據庫的一種,以鍵值對的形式存儲。Spring對Redis的支援是透過Spring Data Redis來實現的,給我們提供了RedisTemplate和StringRedisTemplate兩種模板來操作數據。Spring Boot框架也提供了對Redis的支援,下面我們來講一下Spring Boot框架整合Redis的步驟。

Spring Boot如何整合Redis

工具/材料

IntelliJ IDEA

操作方法

Spring Boot整合Redis我們需要添加依賴的jar包,spring-boot-starter-data-redis中包含spring和redis相關的jar包,jedis作爲redis的客戶端也需要添加到工程中,Spring Boot的版本資訊在父pom中已指定,子模組中的spring相關的jar包無需另外指定。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.0-m1</version>
</dependency>

Spring Boot如何整合Redis 第2張

Spring Boot會根據application.properties中的配置對Redis的屬性進行自動配置,並注入到RedisProperties類中。在application.properties配置檔案中這些屬性都是以spring.redis爲前綴的,值得注意的是在Spring Boot 1.5.x版本中默認的Redis客戶端是jedis,因此在配置檔案中無需指定,如下圖所示。

Spring Boot如何整合Redis 第3張

Spring Boot 1.5.x版本的整合配置網上可以搜尋大量的文章,然而Spring Boot 2.x版本的整合資料卻非常少,甚至提供的配置不能正常使用,因此本文主要講解Spring Boot 2.x整合Redis以及Redis的使用情況。spring-boot 2.x版本有jedis和lettuce兩種客戶端,因此我們必須要去指定使用哪一種客戶端,兩個客戶端的配置如下圖所示,本文使用的是Jedis客戶端連接池,具體的配置如下。
# Redis數據庫索引(默認爲0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1

# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認爲空)
spring.redis.password=xylx1.t!@#
# 配置jedis連接池
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 連接池中的最大空閒連接
spring.redis.jedis.pool.max-idle=8
# 連接池中的最小空閒連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=5000ms
由配置我們可以看到spring-boot 2.x版本時間設定需要加單位ms,因爲參數的類型爲Duration。另外spring.redis.timeout儘量不要配置0,否則可能會出現io.lettuce.core.RedisCommandTimeoutException: Command timed out超時錯誤。

Spring Boot如何整合Redis 第4張
Spring Boot如何整合Redis 第5張

配置檔案編輯完成後,我們開始編寫代碼實現Redis數據的存儲和讀取。我們創建一個RedisUtil工具類,該類使用@Component註解表示交由Spring管理,StringRedisTemplate是Spring提供的,可以使用@Autowired註解直接注入,接下來便可以書寫存和取的代碼了。
@Component
public class RedisUtil {

@Autowired
private StringRedisTemplate redisTemplate;

/**
* 存字元串
* @param key 快取鍵
* @param value 快取值
* @param expireTime 過期時間(s)
*/
public void setString(String key, String value, int expireTime){
ValueOperations<String, String> ops = redisTemplate.opsForValue();
if (expireTime != 0) {
ops.set(key, value, expireTime, TimeUnit.SECONDS);
} else {
ops.set(key,value);
}
}

/**
* 取字元串
* @param key 快取鍵
* @return 快取值
*/
public String getString(String key){
ValueOperations<String, String> ops = this.redisTemplate.opsForValue();
return ops.get(key);
}

Spring Boot如何整合Redis 第6張

接下來我們編寫Controller層代碼去調用RedisUtil工具類,實現數據的存儲和讀取,代碼比較簡單可以參考下圖。若想驗證Redis是否可用,還需要編寫啓動類,如下圖所示。

Spring Boot如何整合Redis 第7張
Spring Boot如何整合Redis 第8張

由上圖可看到我們編寫了一個post請求用於存儲字元串,get請求用於取出字元串。啓動類透過main方法啓動應用,接下來我們使用postman去模擬瀏覽器調用post和get請求,由下圖可以看到Redis存儲的數據成功被取出。

Spring Boot如何整合Redis 第9張
Spring Boot如何整合Redis 第10張

接下來我們介紹Jedis,這是一個封裝了Redis的客戶端,在Spring Boot整合Redis的基礎上,可以提供更簡單的API操作。因此我們需要配置JedisPool的Bean,代碼如下,其中@Configuration註解表明這是一個配置類,我們在該類中注入RedisProperties,並且使用@Bean註解指定JedisPool。
@Configuration
public class RedisConfiguration {

@Autowired
private RedisProperties properties;

@Bean
public JedisPool getJedisPool(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(properties.getJedis().getPool().getMaxIdle());
config.setMaxTotal(properties.getJedis().getPool().getMaxActive());
config.setMaxWaitMillis(properties.getJedis().getPool().getMaxWait().toMillis());
JedisPool pool = new JedisPool(config,properties.getHost(),
properties.getPort(),100,
properties.getPassword(), properties.getDatabase());
return pool;
}
}

Spring Boot如何整合Redis 第11張

接下來我們編輯JedisUtil工具類,透過SpringBoot容器的@Component註解來自動創建,並且注入JedisPool,使用jedisPool.getResource()方法來獲取Jedis,並最終實現操作redis數據庫,其代碼如下。
@Component
public class JedisUtil {

@Autowired
JedisPool jedisPool;

//獲取key的value值
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String str = "";
try {
str = jedis.get(key);
} finally {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return str;
}

public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String str = "";
try {
str = jedis.set(key, value);
} finally {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return str;
}

}

Spring Boot如何整合Redis 第12張

JedisUtil工具類編寫完成後,我們修改之前的RedisController,並注入JedisUtil,代碼如下圖所示。然後再用postman分別調用post和get接口,我們可以看到成功取到了新的key的value值。

Spring Boot如何整合Redis 第13張
Spring Boot如何整合Redis 第14張

特別提示

在Spring Boot整合Redis前本機需安裝Redis,另外可以使用RedisDesktopManager這個Redis這個桌面管理工具檢視Redis中的數據。

標籤:Spring Boot Redis 整合