Spring Boot 2.X(六):Spring Boot 整合Redis
Redis 簡介
什麼是 Redis
Redis 是目前使用的非常廣泛的免費開源記憶體資料庫,是一個高效能的 key-value 資料庫。
Redis 與其他 key-value 快取(如 Memcached )相比有以下三個特點:
1.Redis 支援資料的持久化,它可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
2.Redis 不僅僅支援簡單的 key-value 型別的資料,同時還提供 list,set,zset,hash 等資料結構的儲存。
3.Redis 支援資料的備份,即 master-slave 模式的資料備份。
Redis 優勢如下:
1.效能極高。Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s。
2.豐富的資料型別。Redis 支援二進位制案例的 Strings,Lists,Sets 及 Ordered Sets 資料型別操作。
3.原子性。Redis 所有的操作都是原子性的,意思是要麼成功執行要麼失敗完全不執行。單個操作是原子性的,多個操作也是,通過 MULTI 和 EXEC 指令抱起來。
4.豐富的特性。Redis 還支援 publish/subscribe,通知,key 過期等特性。
Spring Boot 整合 Redis
1.在專案中新增依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>cn.zwqh</groupId> <artifactId>spring-boot-redis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-redis</name> <description>spring-boot-redis</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
檢視 jar 包時發現,Spring Data Redis 下 org.springframework.data.redis.connection 包路徑下面預設有兩個包 jedis 和 lettuce,這說明 Spring Boot 已經預設包裝適配了這兩個 Redis 客戶端。
在 springboot 1.5.x版本的預設的Redis客戶端是 Jedis實現的,springboot 2.x版本中預設客戶端是用 lettuce實現的。
Lettuce 與 Jedis 比較
Lettuce 和 Jedis 的都是連線 Redis Server的客戶端。
Jedis 在實現上是直連 redis server,多執行緒環境下非執行緒安全,除非使用連線池,為每個 redis例項增加物理連線。
Lettuce 是 一種可伸縮,執行緒安全,完全非阻塞的Redis客戶端,多個執行緒可以共享一個RedisConnection,它利用Netty NIO 框架來高效地管理多個連線,從而提供了非同步和同步資料訪問方式,用於構建非阻塞的反應性應用程式。
下面我們分別使用 Lettuce 和 Jedis 來整合 Redis 服務
2. Lettuce 整合 Redis 服務
匯入依賴
由於 Spring Boot 2.X 預設集成了 Lettuce ,所以無需匯入。
application.properties配置檔案
################ Redis 基礎配置 ##############
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連線埠
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=zwqh
# 連結超時時間 單位 ms(毫秒)
spring.redis.timeout=3000
################ Redis 執行緒池設定 ##############
# 連線池最大連線數(使用負值表示沒有限制) 預設 8
spring.redis.lettuce.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制) 預設 -1
spring.redis.lettuce.pool.max-wait=-1
# 連線池中的最大空閒連線 預設 8
spring.redis.lettuce.pool.max-idle=8
# 連線池中的最小空閒連線 預設 0
spring.redis.lettuce.pool.min-idle=0
自定義 RedisTemplate
預設情況下的模板只能支援 RedisTemplate<String,String>
,只能存入字串,很多時候,我們需要自定義 RedisTemplate ,設定序列化器,這樣我們可以很方便的操作例項物件。如下所示:
@Configuration
public class LettuceRedisConfig {
@Bean
public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
序列化實體類
public class UserEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5237730257103305078L;
private Long id;
private String userName;
private String userSex;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
}
單元測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootRedisApplicationTests {
@Autowired
private RedisTemplate<String, String> strRedisTemplate;
@Autowired
private RedisTemplate<String, Serializable> serializableRedisTemplate;
@Test
public void testString() {
strRedisTemplate.opsForValue().set("strKey", "zwqh");
System.out.println(strRedisTemplate.opsForValue().get("strKey"));
}
@Test
public void testSerializable() {
UserEntity user=new UserEntity();
user.setId(1L);
user.setUserName("朝霧輕寒");
user.setUserSex("男");
serializableRedisTemplate.opsForValue().set("user", user);
UserEntity user2 = (UserEntity) serializableRedisTemplate.opsForValue().get("user");
System.out.println("user:"+user2.getId()+","+user2.getUserName()+","+user2.getUserSex());
}
}
執行結果如下:
得到我們預期的結果。
3.Jedis 整合 Redis 服務
pom 檔案
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>cn.zwqh</groupId>
<artifactId>spring-boot-redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-redis</name>
<description>spring-boot-redis</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<!-- 排除lettuce包 -->
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 新增jedis客戶端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties配置檔案
################ Redis 基礎配置 ##############
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連線埠
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=zwqh
# 連結超時時間 單位 ms(毫秒)
spring.redis.timeout=3000
################ Redis 執行緒池設定 ##############
# 連線池最大連線數(使用負值表示沒有限制) 預設 8
spring.redis.jedis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制) 預設 -1
spring.redis.jedis.pool.max-wait=-1
# 連線池中的最大空閒連線 預設 8
spring.redis.jedis.pool.max-idle=8
# 連線池中的最小空閒連線 預設 0
spring.redis.jedis.pool.min-idle=0
JedisRedisConfig
@Configuration
public class JedisRedisConfig {
@Value("${spring.redis.database}")
private int database;
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
@Value("${spring.redis.jedis.pool.max-wait}")
private long maxWaitMillis;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
/**
* 連線池配置資訊
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大連線數
jedisPoolConfig.setMaxTotal(maxActive);
// 當池內沒有可用連線時,最大等待時間
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 最大空閒連線數
jedisPoolConfig.setMinIdle(maxIdle);
// 最小空閒連線數
jedisPoolConfig.setMinIdle(minIdle);
// 其他屬性可以自行新增
return jedisPoolConfig;
}
/**
* Jedis 連線
*
* @param jedisPoolConfig
* @return
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling()
.poolConfig(jedisPoolConfig).and().readTimeout(Duration.ofMillis(timeout)).build();
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
}
/**
* 快取管理器
*
* @param connectionFactory
* @return
*/
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.create(connectionFactory);
}
@Bean
public RedisTemplate<String, Serializable> redisTemplate(JedisConnectionFactory connectionFactory) {
RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));
return redisTemplate;
}
}
單元測試同上
出現預期結果。
總結
上面介紹了 Spring Boot 2.X 如何通過 Lettuce 和 Jedis 來整合 Redis 服務,按專案需求,我們也可以自定義操作類來實現資料操作。
示例程式碼
github
碼雲
非特殊說明,本文版權歸 朝霧輕寒 所有,轉載請註明出處.
原文標題:Spring Boot 2.X(六):Spring Boot 整合Redis
原文地址:https://www.zwqh.top/article/info