SpringBoot下集成Redis Cluster集群實踐
POM
這里Redis Cluster集群為3主3從的架構模式,其中Redis版本為7.0。SpringBoot及其相關依賴的版本如下所示。Spring Boot 2.X版本開始,其使用的Redis客戶端由Jedis變?yōu)長ettuce。Lettuce提供了對Redis Cluster集群中MOVED、ASK重定向的支持
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--集成redis組件所需的common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
...
</dependencies>
配置文件
SpringBoot下application.properties配置文件中關于Redis的配置如下所示。由于Lettuce客戶端默認不開啟集群拓撲刷新功能。故連接Redis集群時,我們需要開啟Lettuce客戶端對集群拓撲的刷新功能。以便在集群節(jié)點進行主從切換后,Lettuce客戶端可以感知到集群節(jié)點的變化。具體地,Lettuce提供了三種刷新集群拓撲的方式:
-
通過主動調(diào)用 RedisClusterClient.reloadPartitions 方式進行手動刷新 -
后臺定時刷新 -
后臺自適應刷新(基于鏈接斷開、MOVED/ASK重定向)
在SpringBoot2.3.x后,可直接通過spring.redis.lettuce.cluster.refresh.adaptive、spring.redis.lettuce.cluster.refresh.period 配置項開啟自適應刷新、定時刷新功能
# Redis 集群信息配置
# Redis 數(shù)據(jù)庫索引
spring.redis.database=0
# Redis 服務器連接密碼
spring.redis.password=52996
# 連接超時時間, Unit: 毫秒
spring.redis.timeout=1000
# 集群所有(主、從)節(jié)點地址信息
spring.redis.cluster.nodes=120.120.120.11:6379,120.120.120.12:6379,120.120.120.13:6379,120.120.120.14:6379,120.120.120.15:6379,120.120.120.16:6379
# 重定向的最大次數(shù)
spring.redis.cluster.max-redirects=3
# Redis客戶端Lettuce配置
# 使能集群拓撲自適應刷新,默認值:false
spring.redis.lettuce.cluster.refresh.adaptive=true
# 集群拓撲定時刷新周期,Unit:毫秒
spring.redis.lettuce.cluster.refresh.period=30000
# 連接池最大連接數(shù)(使用負值表示沒有限制) 默認 8
spring.redis.lettuce.pool.max-active=-1
# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
spring.redis.lettuce.pool.max-wait=-1
# 連接池中的最大空閑連接 默認 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閑連接 默認 0
spring.redis.lettuce.pool.min-idle=0
配置類
SpringBoot中Redis配置類如下所示
@Slf4j
@Configuration
public class RedisConfig extends CachingConfigurerSupport{
// Redis 配置類
// 自定義的RedisTemplate的Bean名稱必須為 redisTemplate。當方法名不為 redisTemplate時,可通過name顯示指定bean名稱,@Bean(name="redisTemplate")
@Bean(name = "redisTemplate")
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 設置String Key序列化
template.setKeySerializer( getKeySerializer() );
template.setValueSerializer( getValueSerializer() );
// 設置Hash Key序列化
template.setHashKeySerializer( getKeySerializer() );
template.setHashValueSerializer( getValueSerializer() );
log.info("自定義RedisTemplate配置完成 ... ");
return template;
}
// key 采用String序列化
private RedisSerializer<String> getKeySerializer() {
return new StringRedisSerializer();
}
// value 采用Json序列化
private RedisSerializer<Object> getValueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
使用
這里我們直接通過Controller來驗證
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/setRedisData")
public void setRedisData(@RequestParam String key, @RequestParam Object value) {
redisTemplate.opsForValue().set(key, value);
}
@GetMapping("/getRedisData")
public String getRedisData(@RequestParam String key) {
Object value = redisTemplate.opsForValue().get(key);
return key + " --->>> " + value;
}
}
測試結果如下,符合預期
評論
圖片
表情
