当前位置: 首页 > news >正文

springboot整合redis-RedisTemplate集群模式

springboot整合redis-RedisTemplate集群模式

文档

  1. redis单机安装
  2. redis常用的五种数据类型
  3. redis数据类型-位图bitmap
  4. redis数据类型-基数统计HyperLogLog
  5. redis数据类型-地理空间GEO
  6. redis数据类型-流Stream
  7. redis数据类型-位域bitfield
  8. redis持久化-RDB
  9. redis持久化-AOF
  10. redis持久化-RDB+AOF混合模式
  11. redis持久化-纯缓存模式
  12. redis事务
  13. redis管道 -redis pipeline -redis pipelining
  14. redis发布订阅
  15. redis主从复制
  16. redis哨兵模式
  17. redis集群模式 -分区算法
  18. redis集群模式 -集群搭建
  19. redis集群模式 -节点故障 -节点主从调整
  20. redis集群模式 -扩缩容
  21. redis集群模式 -批量操作
  22. springboot整合redis-Jedis
  23. springboot整合redis-Lettuce
  24. springboot整合redis-RedisTemplate单机模式

官方文档

  1. 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
  2. Redis cluster specification

说明

  1. redis版本:7.0.0
  2. springboot版本:3.2.0

springboot整合redis-RedisTemplate集群模式

安装集群模式redis
  1. 安装集群模式redis参考文档:redis集群模式 -集群搭建
引入依赖
  1. 引入依赖

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    • 版本号:3.2.0,与springboot版本一致
配置连接信息
  1. 修改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
    
  2. 在配置中,默认生效的spring.data.redis.client-typelettuce

  3. 启动服务默认加载的RedisTemplateStringRedisTemplate的Bean对象,使用的RedisConnectionFactoryLettuceConnectionFactory实现类对象。自定义RedisTemplate的Bean时,也使用LettuceConnectionFactory。参考:org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

  4. 参数含义

    1. spring.data.redis.cluster.max-redirects:未找到正确节点而发生重定向,最大重定向次数
    2. spring.data.redis.lettuce.cluster.refresh.dynamic-refresh-sources:是否发现并查询所有集群节点以获取集群拓扑。当设置为false时,只有初始种子节点用作拓扑发现的源。默认true开启
    3. spring.data.redis.lettuce.cluster.refresh.adaptive:Redis 集群的拓扑结构(节点列表、槽位分配关系等)可能因节点故障、扩容缩容、槽位迁移等操作发生变化,自适应刷新。默认false关闭
    4. spring.data.redis.lettuce.cluster.refresh.period:定时刷新时间间隔(毫秒)
自定义RedisTemplate的Bean
  1. 自定义RedisTemplate的Bean后,默认的RedisTemplate的Bean将失效

  2. 不自定义RedisTemplate的Bean,使用默认的RedisTemplate的Bean,可能会产生序列化的问题,参考:springboot整合redis-RedisTemplate单机模式

  3. 添加配置类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;}
    }
    
    • 这里使用的RedisConnectionFactoryLettuceConnectionFactory实现类对象
示例
  1. 启动springboot服务,通过注入RedisTemplate的对象来操作reids

  2. 参考springboot整合redis-RedisTemplate单机模式文章的示例,在此基础上增加clusterTest方法,获取key的slot信息

  3. 添加接口OrderService

    public interface OrderService {void addOrder();String getOrderById(Integer keyId);void clusterTest();
    }
    
  4. 添加实现类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);}
    }
    
  5. 添加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();}
    }
    
  6. 调用接口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
    
http://www.dtcms.com/a/502981.html

相关文章:

  • Spring AOP 实战案例+避坑指南
  • 第三章 栈和队列——课后习题解练【数据结构(c语言版 第2版)】
  • Kubernetes Ingress与安全机制
  • 【企业架构】TOGAF架构标准规范-机会与解决方案
  • apache建设本地网站wordpress修改成中文字体
  • windows平台,用pgloader转换mysql到postgresql
  • Linux驱动第一期1-10-驱动基础总结
  • 我的WordPress网站梅林固件做网站
  • 分库分表:基础介绍
  • 使用css `focus-visible` 改善用户体验
  • AI人工智能-深度学习的基本原理-第二周(小白)
  • 【2070】数字对调
  • 【AI智能体】Coze 提取对标账号短视频生成视频文案实战详解
  • IOT项目——ESP系列
  • 【成长纪实】Dart 与 ArkTS 函数与类的对比学习:从 Flutter 到 HarmonyOS
  • 基于 JETSON+FPGA+GMSL+AI 车载视频采集与存储系统设计(二)系统测试
  • Flutter Event Loop
  • LeetCode 1287.有序数组中出现次数超过25%的元素
  • 递归-50.Pow(x,n)-力扣(LeetCode)
  • Flutter 并发编程全解:从零掌握 Isolate
  • 跨网络互联技术(①Singbox Core-Flutter-Android)
  • 移动端网站的重要性做一款推荐类的网站
  • 用div做网站中间部分做网站是干啥的
  • 【思维导图SimpleMind Pro】SimpleMind Pro——轻量级思维导图软件完全指南:轻量专业,让思维高效可视化
  • jlink烧入软件的使用
  • 03-流程控制语句-教程
  • 【mqtt参数上云和小程序开发】【第5期】hcsr04超声波测距模块调试完成
  • 【STM32笔记】:P03 ISP 一键下载电路详解
  • 江苏省网站建设哪家好php做的购物网站
  • 常见的位运算的总结