SpringBoot下集成Redis Cluster集群实践
ProjectDaedalus
共 6066字,需浏览 13分钟
· 2023-08-30
POM
这里Redis Cluster集群为3主3从的架构模式,其中Redis版本为7.0。SpringBoot及其相关依赖的版本如下所示。Spring Boot 2.X版本开始,其使用的Redis客户端由Jedis变为Lettuce。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客户端对集群拓扑的刷新功能。以便在集群节点进行主从切换后,Lettuce客户端可以感知到集群节点的变化。具体地,Lettuce提供了三种刷新集群拓扑的方式:
-
通过主动调用 RedisClusterClient.reloadPartitions 方式进行手动刷新 -
后台定时刷新 -
后台自适应刷新(基于链接断开、MOVED/ASK重定向)
在SpringBoot2.3.x后,可直接通过spring.redis.lettuce.cluster.refresh.adaptive、spring.redis.lettuce.cluster.refresh.period 配置项开启自适应刷新、定时刷新功能
# Redis 集群信息配置
# Redis 数据库索引
spring.redis.database=0
# Redis 服务器连接密码
spring.redis.password=52996
# 连接超时时间, Unit: 毫秒
spring.redis.timeout=1000
# 集群所有(主、从)节点地址信息
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
# 重定向的最大次数
spring.redis.cluster.max-redirects=3
# Redis客户端Lettuce配置
# 使能集群拓扑自适应刷新,默认值:false
spring.redis.lettuce.cluster.refresh.adaptive=true
# 集群拓扑定时刷新周期,Unit:毫秒
spring.redis.lettuce.cluster.refresh.period=30000
# 连接池最大连接数(使用负值表示没有限制) 默认 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;
}
}
测试结果如下,符合预期
评论
.NET 开源工具库,集成超过1000个扩展方法
前言推荐一个.NET 开源项目,集成了超过1000个扩展方法。项目简介Z.ExtensionMethods是由zzzprojects公司开发并维护的一款开源库,为.NET开发人员提供一系列实用的扩展方法,可以减少重复劳动、提高开发效率,支持.NET Framework 和 .NET Core。该项目
dotNET全栈开发
10
文末送书 | 大模型时代下如何学习云原生
《containerd 原理剖析与实战》新书内购中,点击阅读原文,限时 69.9 元购买。文末免费赠书大模型与云原生近年来,大语言模型的热度可谓是愈发高涨,尤其是今年年初 Sora 的出现,更是让全球再次看到了AIGC 的巨大威力。Sora 生成实例视频---几头巨大的长毛猛犸踏着积雪的草地而来在当
云原生实验室
10
Redis 是怎么从单体架构发展到分布式缓存的?
图解学习网站:https://xiaolincoding.comRedis 架构是如何一步一步发展到今天的样子的?2010 年 - 单体 RedisRedis 1.0 于 2010 年发布,当时的架构非常简单。它通常用作业务应用程序的缓存。不过,Redis 将数据存储在内存中。当我们重启 Redis
小林coding
10
2025年有望破万亿,AIoT助力下,物流行业正在迎来快速发展
作者:王飞鹏物联网智库 原创3月底,正在赶赴港股上市的菜鸟网络被阿里总部召回,上市进程按下了暂停键。在阿里去年定下“大拆分”战略后,菜鸟本是最有希望率先独立IPO的企业,但是在临门一脚之际,阿里却做出了不上市的决策。这一举动引发了外界热议。分析人士普遍认为,阿里之所以做出这一决策,很重要的一个原因是
物联网智库
0
8则实用的纯CSS布局排版技巧 | 网易4年实践
「链接和长图失效,请大家点击阅读原文查看详情」前言开发每一张网页都离不开布局排版,基于良好布局排版打下基础,才能使后续的开发更顺利。当然不能停留在IExplorer时代那种局限思维上,没办法解决的布局排版都用JS实现😂。今时不同往日,现代CSS属性能更好地快速实现各种布局排版,节约更多时间去摸鱼😉。
前端迷
10
得物面试:Redis 内存碎片是什么?如何清理?
JavaGuide官方网站:javaguide.cn这是一道不是特别高频但很重要的 Redis 面试题,属于 Redis 性能优化的范畴。Redis 内存碎片相关的问题在得物、美团、阿里、字节、携程等公司的后端面试中都曾出现过,还是建议认真准备一下。即使不是准备面试,日常开发也是能够用到的!什么是内
JavaGuide
0
性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:azdebug.blog.csdn.net/article/details/103697108前言具体实现细节测试结果总结前言开发目的: 提高百万级数据
Java架构师社区
0
InfiniBand网络、HDR和IB在超算中的应用实践
InfiniBand(IB)是由InfiniBand贸易协会(IBTA)建立的先进计算机网络通信标准。它在高性能计算(HPC)中的广泛采用归功于它能够为网络传输提供卓越的吞吐量、带宽和低延迟。InfiniBand是计算系统内部和外部的关键数据连接。无论是通过直接链路还是通过网络交换机进行互连,Inf
架构师技术联盟
10