springboot整合redis-RedisTemplate集群模式
springboot整合redis-RedisTemplate集群模式
文档
- redis单机安装
- redis常用的五种数据类型
- redis数据类型-位图bitmap
- redis数据类型-基数统计HyperLogLog
- redis数据类型-地理空间GEO
- redis数据类型-流Stream
- redis数据类型-位域bitfield
- redis持久化-RDB
- redis持久化-AOF
- redis持久化-RDB+AOF混合模式
- redis持久化-纯缓存模式
- redis事务
- redis管道 -redis pipeline -redis pipelining
- redis发布订阅
- redis主从复制
- redis哨兵模式
- redis集群模式 -分区算法
- redis集群模式 -集群搭建
- redis集群模式 -节点故障 -节点主从调整
- redis集群模式 -扩缩容
- redis集群模式 -批量操作
- springboot整合redis-Jedis
- springboot整合redis-Lettuce
- springboot整合redis-RedisTemplate单机模式
官方文档
- 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
- Redis cluster specification
说明
- redis版本:7.0.0
- springboot版本:3.2.0
springboot整合redis-RedisTemplate集群模式
安装集群模式redis
- 安装集群模式redis参考文档:redis集群模式 -集群搭建
引入依赖
-
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
- 版本号:
3.2.0
,与springboot版本一致
- 版本号:
配置连接信息
-
修改
application.yml
配置文件spring:data:redis:password: 123456cluster:# 未找到正确节点而发生重定向,最大重定向次数max-redirects: 5nodes: 192.168.145.132:6379,192.168.145.133:6380,192.168.145.134:6381lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0cluster:refresh:# Redis 集群的拓扑结构(节点列表、槽位分配关系等)可能因节点故障、扩容缩容、槽位迁移等操作发生变化,自适应刷新。默认false关闭adaptive: true# 定时刷新时间间隔(毫秒)period: 10000logging:level:org.springframework.data.redis: debugio.lettuce.core.cluster: debug
-
在配置中,默认生效的
spring.data.redis.client-type
为lettuce
-
启动服务默认加载的
RedisTemplate
、StringRedisTemplate
的Bean对象,使用的RedisConnectionFactory
为LettuceConnectionFactory
实现类对象。自定义RedisTemplate
的Bean时,也使用LettuceConnectionFactory
。参考:org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
-
参数含义
spring.data.redis.cluster.max-redirects
:未找到正确节点而发生重定向,最大重定向次数spring.data.redis.lettuce.cluster.refresh.dynamic-refresh-sources
:是否发现并查询所有集群节点以获取集群拓扑。当设置为false时,只有初始种子节点用作拓扑发现的源。默认true开启spring.data.redis.lettuce.cluster.refresh.adaptive
:Redis 集群的拓扑结构(节点列表、槽位分配关系等)可能因节点故障、扩容缩容、槽位迁移等操作发生变化,自适应刷新。默认false关闭spring.data.redis.lettuce.cluster.refresh.period
:定时刷新时间间隔(毫秒)
自定义RedisTemplate
的Bean
-
自定义
RedisTemplate
的Bean后,默认的RedisTemplate
的Bean将失效 -
不自定义
RedisTemplate
的Bean,使用默认的RedisTemplate
的Bean,可能会产生序列化的问题,参考:springboot整合redis-RedisTemplate单机模式 -
添加配置类
RedisConfig
,自定义RedisTemplate
的Bean@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置key序列化方式stringredisTemplate.setKeySerializer(new StringRedisSerializer());// 设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;} }
- 这里使用的
RedisConnectionFactory
为LettuceConnectionFactory
实现类对象
- 这里使用的
示例
-
启动springboot服务,通过注入
RedisTemplate
的对象来操作reids -
参考springboot整合redis-RedisTemplate单机模式文章的示例,在此基础上增加
clusterTest
方法,获取key的slot信息 -
添加接口
OrderService
public interface OrderService {void addOrder();String getOrderById(Integer keyId);void clusterTest(); }
-
添加实现类
OrderServiceImpl
@Service public class OrderServiceImpl implements OrderService {public static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic void addOrder() {int keyId = ThreadLocalRandom.current().nextInt(1000) + 1;String serialNo = UUID.randomUUID().toString();String key = "order:" + keyId;String value = "order:" + serialNo;redisTemplate.opsForValue().set(key, value);logger.info("redis key: {}", key);logger.info("redis value: {}", value);String key1 = "order订单:" + keyId;String value1 = "order内容:" + serialNo;redisTemplate.opsForValue().set(key1, value1);logger.info("redis key: {}", key1);logger.info("redis value: {}", value1);}@Overridepublic String getOrderById(Integer keyId) {String key = "order:" + keyId;String value = (String) redisTemplate.opsForValue().get(key);logger.info("redis key: {}", key);logger.info("redis value: {}", value);String key1 = "order订单:" + keyId;String value1 = (String) redisTemplate.opsForValue().get(key1);logger.info("redis key: {}", key1);logger.info("redis value: {}", value1);return value;}@Overridepublic void clusterTest() {RedisClusterCommands redisClusterCommands = redisTemplate.getConnectionFactory().getClusterConnection().clusterCommands();logger.info("k0 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k0".getBytes()));logger.info("k1 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k1".getBytes()));logger.info("k2 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k2".getBytes()));logger.info("k3 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k3".getBytes()));logger.info("k4 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k4".getBytes()));logger.info("k5 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k5".getBytes()));logger.info("k6 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k6".getBytes()));logger.info("k7 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k7".getBytes()));logger.info("k8 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k8".getBytes()));logger.info("k9 keyslot: " + redisClusterCommands.clusterGetSlotForKey("k9".getBytes()));redisTemplate.opsForValue().set("k0", "hello");redisTemplate.opsForValue().set("k1", "hello");redisTemplate.opsForValue().set("k2", "hello");redisTemplate.opsForValue().set("k3", "hello");redisTemplate.opsForValue().set("k4", "hello");redisTemplate.opsForValue().set("k5", "hello");redisTemplate.opsForValue().set("k6", "hello");redisTemplate.opsForValue().set("k7", "hello");redisTemplate.opsForValue().set("k8", "hello");redisTemplate.opsForValue().set("k9", "hello");String k0 = (String) redisTemplate.opsForValue().get("k0");String k1 = (String) redisTemplate.opsForValue().get("k1");String k2 = (String) redisTemplate.opsForValue().get("k2");String k3 = (String) redisTemplate.opsForValue().get("k3");String k4 = (String) redisTemplate.opsForValue().get("k4");String k5 = (String) redisTemplate.opsForValue().get("k5");String k6 = (String) redisTemplate.opsForValue().get("k6");String k7 = (String) redisTemplate.opsForValue().get("k7");String k8 = (String) redisTemplate.opsForValue().get("k8");String k9 = (String) redisTemplate.opsForValue().get("k9");logger.info("redis value: {}", k0);logger.info("redis value: {}", k1);logger.info("redis value: {}", k2);logger.info("redis value: {}", k3);logger.info("redis value: {}", k4);logger.info("redis value: {}", k5);logger.info("redis value: {}", k6);logger.info("redis value: {}", k7);logger.info("redis value: {}", k8);logger.info("redis value: {}", k9);} }
-
添加Controller类
OrderController
@RestController @RequestMapping("order") public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("add")public void addOrder() {orderService.addOrder();}@GetMappingpublic String getOrderById(@RequestParam("keyId") Integer keyId) {return orderService.getOrderById(keyId);}@GetMapping("cluster-test")public void clusterTest() {orderService.clusterTest();} }
-
调用接口
http://localhost:8080/redis01/order/cluster-test
,获取key的slot信息,控制台打印日志如下:2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k0 keyslot: 8579 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k1 keyslot: 12706 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k2 keyslot: 449 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k3 keyslot: 4576 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k4 keyslot: 8455 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k5 keyslot: 12582 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k6 keyslot: 325 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k7 keyslot: 4452 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k8 keyslot: 8331 2025-10-19T21:36:05.339+08:00 INFO 24564 --- [nio-8080-exec-8] x.y.r.service.impl.OrderServiceImpl : k9 keyslot: 12458