Spring Boot 集成 Redis 三种模式实践汇总
背景
项目的某个模块集成了 SpringBoot Redis 包,客户端使用 Lettuce,Redis 测试环境单机模式。但是现场反馈的 Redis 环境是集群,如果简单的修改 spring.redis
配置为集群的配置信息,程序能否能无缝衔接呢?
本文记录这个问题的验证过程:
- 集群配置和单机配置,直接改配置,Redis 操作是否正常?「可以」。
- 同时配置单机和集群信息,哪个配置会优先呢?「集群优先」。
- 集群模式下,主备份切换过程中,程序能否自动找到新的主节点正常读写呢?「Jedis 客户端可以,Luttcue 需要改造」
- 温故一下 Redis 的三种多节点部署方案及其优缺点。
基础准备
第一,Redis 客户端种类, Jedis 、Lettuce 、Redisson,本文选择的是 Lettuce 。
第二,Redis 版本选择 6.2.13,在目标主机上编译完成后并安装:
- 下载 6.2.13 版本,上传服务器。
- 解压,执行编译命令:
make
。 - 安装,指定安装目录:
make install PREFIX=/usr/local/redis6.2.13
第三,Redis 高可用部署方式有三种:
- 主从模式,出现故障需要人工干预;主节点可以读写,从节点只能读不能写。
- 哨兵模式,是对主从的高可用改进,哨兵监控集群状态,出现故障自动处理。
- 集群模式,Redis 的分布式方案,数据分散在多个节点上,无中心的。连接从节点执行写入操作,会自动重定向到主节点完成写入。
集群环境搭建
首先,要注意,6.2.13 版本的集群部署后,会占据两个端口,一个是 Redis 的通信端口,是配置文件中配置的 port
值,另一个是集群通信端口,port + 1000
,所以集群配置时需要注意端口,配置小一点,否则总会莫名其秒端口被占用。
例如,我最初设计的集群各节点的端口是 16793,26793,36793,结果启动的时候总有几个节点启动时端口被其他 Redis 进程占据了。
其次,由于资源有限,在一台主机上,部署三主三从6个 Redis 实例。选择节点从 7000 到 7005 ,搭建集群。
- 进入安装目录 /usr/local/redis6.2.13,按实例端口创建文件夹 mkdir 7000。
- 到 Redis 源码文件夹下,拷贝一个标准配置文件 redis.conf 到 7000 中。
- 编辑 redis.conf 修改跟集群配置相关的几项信息。
bind 0.0.0.0
daemonize yes
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
pidfile /var/run/redis_7000.pid
logfile /usr/local/redis6.2.13/7000/7000.log
dbfilename 7000.rdb
接着,继续创建其他 5 个节点配置文件:
- 以 7000 目录 为基础,拷贝:
cp -r 7000 7001
,编辑 7001/redis.conf , 命令模式下执行字符串替换操作::%s/7000/7001
替换所有的 7000 。 - 以此拷贝出 7002-7005 个配置文件。
- 启动节点:进入 bin 目录下
redis-server ../7000/redis.conf
依次启动全部节点。
最后一步,使用 redis-cli 客户端创建集群:./redis-cli --cluster create 192.168.xx:7000 192.168.xx:7001 192.168xx:7002 192.168.xx:7003 192.168.xx:7004 192.168.xx:7005 --cluster-replicas 1
一路 yes ,耐心等待集群创建完成,查看集群节点进程:
查看某个 Redis 节点的进程端口,可以看到一个 Redis 进程启动了两个端口。因为每个Redis集群中的节点都需要打开两个TCP连接,一个连接用于正常的给Client提供服务,比如 6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,参考该文 《Redis 集群节点启动的两个端口说明》。
参考网上 5.x 版本的部署方案,只有一个端口,可能 6 的版本跟 5 的有差距吧。
验证集群配置
当前应用直接改配置,是否支持集群?
直接修改应用的 redis 配置信息,添加集群配置:
spring:redis:password: x #密码lettuce: #lettuce连接池配置pool:max-active: 8max-idle: 8min-idle: 0max-wait: 1000shutdown-timeout: 100cluster: #集群配置max-redirects: 3nodes: # 配置 - 间隔一个好像也没报错呢。- 192.168.x:7000- 192.168.x:7001- 192.168.x:7002- 192.168.x:7003- 192.168.x:7004- 192.168.x:7005
启动应用,执行 Redis 操作正确,说明直接用框架的自动注入,是支持集群的。
集群主节点故障验证
登录 7000 节点,使用 cluster nodes
查看集群节点,找到一个 master 节点的端口号,登录该主节点后,shutdown
命令停掉该主节点。
引用 Redis 集群的程序在获取 RedisConnection
时出现了超时异常,而且即使主节点恢复了,程序依旧报错,这就涉及到了 《Lettuce 客户端的另外一个坑》。
因为不确定到底使用 Redis 集群还是单机,所以对 Lettuce 自动刷新集群拓扑图配置类注入使用一个开关参数控制,如果是集群,就可以保证集群变更时,客户端实时感知了。
从执行日志来看,无论我停止那个主节点,应用都会报该节点连接异常,继续重试。
DefaultClusterTopologyRefresh : Unable to connect to [192.168.x:7005]: connection timed out: /192.168.x:7005
猜测应该是这个定时刷新任务会对配置的集群节点逐个轮训发送数据判断是否可达吧。
配置优先级
同时配置 host 和 cluster 会怎么样?
集群模式下,只配置一个 host 单机配置,会报错,因为有些请求会产生 moved
或者重定向等问题。同时配置单机节点和集群,集群优先。
判断依据:停掉一个集群主节点后,后台开始刷新重连接尝试,应用正常运行。
集群模式下的读写操作
./redis-cli -h 192.168.X -p 7000 -c
Redis 自带的客户端,-c
这个参数代表集群模式,集群模式下,如果连接从节点,执行写入操作,会自动重定向到主节点完成写入:
不带 -c
参数,会提示一个 moved 地址,需要手动转到该地址执行写入操作:
启示录
集群模式跟主备模式不同,不同节点上执行 keys 的时候,并不是所有节点都有相同的数据。因为集群的本质就是数据分散存储,并不是每个节点上都存储了全部的数据的。
验证完本文这个问题后,把《Redis 开发与运维》这本书拿出来翻了翻,全忘光了。脑子不够用了,还是手动敲一遍,作为笔记留存吧!
相关文章:

Spring Boot 集成 Redis 三种模式实践汇总
背景 项目的某个模块集成了 SpringBoot Redis 包,客户端使用 Lettuce,Redis 测试环境单机模式。但是现场反馈的 Redis 环境是集群,如果简单的修改 spring.redis 配置为集群的配置信息,程序能否能无缝衔接呢? 本文记录…...
MySQL DQL语法
MySQL DQL语法 DQL语法简介 DQL(Data Query Language)语句是一种用于从数据库中检索数据的语言。它主要用于数据查询和数据分析,而不是对数据库中的数据进行更新、插入或删除。DQL语句通常用于获取特定条件下的数据,进行聚合计算…...
算法之线性表1.1.1(7)带头结点链表的反向输出
设L为带头结点的单链表,编写算法实现从尾到头反向输出每个节点的值。 算法思想: 方法一:将链表压栈再输出,时间复杂度为O(n),空间复杂度为O(n) 方法二:用头插法重新建立单链表在输出,时间复杂度为O(n),空…...
设计模式三:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。 在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工…...

Linux用户权限问题详解
Linux用户权限问题详解 【一】Linux权限的概念(1)用户类型(2)如何切换用户(3)用户相关的一些命令 【二】Linux文件权限管理(1)文件访问者的分类(2)文件类型和…...

flask中的session介绍
flask中的session介绍 在Flask中,session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie,将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤: 首先…...

记录联想拯救者R720重装系统
文章目录 bios里找不到U盘启动项2023.7.23重装系统后数据记录C盘内存修改默认AppData的路径(亲测,没用) bios里找不到U盘启动项 制作好启动盘后,开机按F2进入bios后,找不到U盘启动项,如下图所示࿱…...

Spring Alibaba Sentinel实现集群限流demo
1.背景 1.什么是单机限流? 小伙伴们或许遇到过下图这样的限流配置 又或者是这样的Nacos动态配置限流规则: 以上这些是什么限流?没错,就是单机限流,那么单机限流有什么弊端呢? 假设我们集群部署3台机器&a…...
102、SOA、分布式、微服务之间有什么关系和区别?
SOA、分布式、微服务之间有什么关系和区别? 分布式架构是指将单体架构中的各个部分拆分,然后部署到不同的机器或进程中去,SOA和微服务基本上都是分布式架构师SOA是一种面向服务的架构,系统的所有服务都注册在总线上,当调用服务时…...

Ubuntu 20.04下的录屏与视频剪辑软件
ubuntu20.04下的录屏与视频剪辑 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 2、设置录制窗口参数 3、开始录制 二、视频剪辑软件kdenlive的安装 1、安装 2、启动 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 (1)直接在终端输入以下命…...
面试题 -- iOS数据存储
文章目录 一、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?二、SQLite 数据存储是怎么用?三、简单描述下客户端的缓存机制?四、实现过多线程的Core Data 么?NSPersistentStoreCoordinator࿰…...
spring复习:(51)environment、systemProperties、systemEnvironment三个bean是在哪里被添加到容器的?
一、主类: package cn.edu.tju.study.service.anno;import cn.edu.tju.study.service.anno.config.MyConfig; import cn.edu.tju.study.service.anno.domain.Person; import com.sun.javafx.runtime.SystemProperties; import org.springframework.context.annotat…...

element ui 上传控件携带参数到后端
1.携带固定参数: 2.携带不固定参数: <el-row> <el-col :span"24"> <el-upload :multiple"false" :show-file-list"false" :on-success"f_h…...
scrapy分布式+指纹去重原理
1,指纹去重原理存在于 scrapy.util.requests 里面 需要安装的包 pip install scrapy-redis-cluster # 安装模块 pip install scrapy-redis-cluster0.4 # 安装模块时指定版本 pip install --upgrade scrapy-redis-cluster # 升级模块版本 2,setting配置 …...

FileHub使用教程:Github Token获取步骤,使用快人一步
FileHub介绍 filehub是我开发的一个免费文件存储软件,可存万物。软件仓库:GitHub - Sjj1024/s-hub: 一个使用github作为资源存储的软件 软件下载地址:。有问题可以留言或者提Issue, 使用第一步:获取Github Token 使…...

嵌入式开发:单片机嵌入式Linux学习路径
SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。…...
Libvirt的virsh工具常用命令
在使用Libvirt的virsh工具时,以下是常见的一些命令: 连接到Hypervisor: virsh -c <URI>:连接到指定的Hypervisor,例如 virsh -c qemu:///system 连接到本地的QEMU/KVM Hypervisor。 虚拟机管理: list…...
高斯消元解异或方程组写法
高斯约旦消元解异或方程组 for(int j1;j<n;j){for(int ij1;i<n;i)if(a[i][j]){swap(a[i],a[j]);break;}if(!a[i][i]){if(a[i][n1])//no...else ...//mul}for(int i1;i<n;i)if(i!j&&a[i][j])for(int kj;k<n1;k)a[i][k]^a[j][k];}正常高斯消元法 int r1;for…...

前端 mock 数据的几种方式
目录 接口demo Better-mock just mock koa webpack Charles 总结 具体需求开发前,后端往往只提供接口文档,对于前端,最简单的方式就是把想要的数据写死在代码里进行开发,但这样的坏处就是和后端联调前还需要再把写死的数据…...
【GO】go语言入门实战 —— 猜数字游戏
文章目录 程序介绍设置随机数读取用户输入实现判断逻辑实现游戏循环完整代码 程序介绍 首先生成一个介于1~100之间的随机数,然后提示玩家输入数字,并告诉玩家是猜对了还是猜错了,如果对了程序就结束,如果错了就提醒玩家是大了还是…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...