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

SpringBoot Redis入门(四)——Redis单机、哨兵、集群模式

  • 单机模式:单台缓存服务器,开发、测试环境下使用;
  • 哨兵模式:主-从模式,提高缓存服务器的高可用安全性。所有缓存的数据在每个节点上都一致。每个节点添加监听器,不断监听节点可用状态,一旦主节点不能再提供服务。各监听器会立即在“从节点“中投票选择一台将之作为”主节点“器。从而使业务系统服务不会被中断。当然主节点具体出了什么问题,还得运维人员排查并及时修复并上线;
  • 集群模式:分布式+主从模式,具有高可用安全性高数据量大并发量大等优势。一般需要6台服务器,3台主+3台从。一般在缓存数据量大或者并发访问量非常高以至于单台服务器已经无法承受这样的数据量或访问量时才考虑集群模式。集群模式中几台主服务器中的数据是不一致的,只有主和从中的数据是相同的。

在SpringBoot中使用哨兵模式和集群模式,也是不费吹灰之力。对于我们使用来说和前面单机模式没有任何区别。唯一需要做的就是告诉SbringBoot框架:这个项目我要使用哨兵模式,这个项目我要使用集群模式。如何告诉框架呢,当然是通过application.yml文件中的配置来说明:
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>lab-03-redis</artifactId><groupId>com.luo</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>lab-03-redis-06-redis-cluster</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 实现对 Spring Data Redis 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- pool 对象池 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!-- 阿里JSON解析器 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.34</version></dependency><!-- 引入 Swagger 依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!-- 引入 Swagger UI 依赖,以实现 API 接口的 UI 界面 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!-- 方便等会写单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies></project>

关于使用哨兵模式的Redis缓存配置:

spring:profiles:active: cluster
---
spring:profiles: standalone# 默认使用的是lettuce框架封装的redis操作# 默认连接redis的s顺序: 先 Sentinel哨兵模式 -> Cluster集群 -> 单机Redisredis:host: 127.0.0.1 # 连接redis的ipport: 6379database: 0 # 连接的是redis的几号数据库password: 123456  # 连接redis的密码lettuce:#      连接池pool:max-wait: 100ms  # 连接的最大等待时间max-active: 8  # 最大连接数max-idle: 4 # 最大空闲连接数min-idle: 0 # 最小空闲连接数---
spring:profiles: sentinelredis:host: 127.0.0.1 # 连接redis的ipport: 6379database: 0 # 连接的是redis的几号数据库password: 123456  # 连接redis的密码lettuce:#      连接池pool:max-wait: 100ms  # 连接的最大等待时间max-active: 8  # 最大连接数max-idle: 4 # 最大空闲连接数min-idle: 0 # 最小空闲连接数sentinel:master: mymaster  # 配置哨兵时候master的名字nodes:- 127.0.0.1:26379- 127.0.0.1:26380- 127.0.0.1:26381---
spring:profiles: clusterredis:host: 127.0.0.1 # 连接redis的ipport: 6379database: 0 # 连接的是redis的几号数据库password: 123456  # 连接redis的密码lettuce:#      连接池pool:max-wait: 100ms  # 连接的最大等待时间max-active: 8  # 最大连接数max-idle: 4 # 最大空闲连接数min-idle: 0 # 最小空闲连接数# 配置集群cluster:nodes:- 127.0.0.1:6379- 127.0.0.1:6380- 127.0.0.1:6381- 127.0.0.1:7379- 127.0.0.1:7380- 127.0.0.1:7381

哨兵模式的配置中,特别注意:*ndes配置的是哨兵的IP和端口,并非缓存服务器的;
集群模式的配置,都是缓存服务器的IP和端口。

接下来我们验证一下哨兵模式和集群模式在使用结果上的差异;

哨兵模式

如下图所示:三台缓存服务器,每台服务都有对应哨兵;
在这里插入图片描述

将6个服务启动后,如下图所示:
主:6380;从:6379、6381;
在这里插入图片描述

1、一主多从,读写分离
	//测试方法public Object getUserInfo(String username) {if (redisTemplate.opsForValue().get(username) == null) {System.out.println("未获取到缓存,新建用户信息.............");Map<String, Object> user = new HashMap<>();user.put("username", username);user.put("usercode", "zhangsan");user.put("sex", "男");user.put("createtime", new Date());redisTemplate.opsForValue().set(username, user);}return redisTemplate.opsForValue().get(username);}@Testpublic void testRedis() throws InterruptedException {System.out.println(userService.getUserInfo("1"));System.out.println(userService.getUserInfo("2"));System.out.println(userService.getUserInfo("3"));}

三台缓存服务器存储结果都是一致的,由此可见,哨兵模式是一主多从和读写分离模式。
在这里插入图片描述

2、主服务宕机,从服务升级主

哨兵模式另一目的就是当Master宏机后,从服务可快速自动升级为Master,不致于业务被中断。

当我们将主服务器6380停机之后,将会出现以下的内容。
三台哨兵控制台中都打印了,切换master的日志,可以看出主服务器已经变为6381这台服务器了。
在这里插入图片描述
对于我们的系统而言,由于缓存配置也是配置的哨兵的地址,主服务挂了之后,对于我们系统并无影响。

集群模式

集群模式一般需要6台服务器,3主3从,如下图共有6台缓存服务器。
在这里插入图片描述
分别启动6台服务器后,再cmd命令模式下执行一个命令,完成集群配置:

redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:7379 127.0.0.1:7380 127.0.0.1:7381 --cluster-replicas 1 -a 123456

集群启动后:
在这里插入图片描述
集群情况:在这里插入图片描述
主:6379、6381、6380;从:7379、7380、7381;

1、分布式存储
    @Testpublic void testRedis() throws InterruptedException {System.out.println(userService.getUserInfo("1"));System.out.println(userService.getUserInfo("2"));System.out.println(userService.getUserInfo("20000001"));System.out.println(userService.getUserInfo("20200002"));}

在这里插入图片描述
从结果看:
我们存储了4个值,1、2、2000001、20200002。
1,2------------> 主6380,从7381;
2000001----->主6381,从7379;
20200002—>主6379,从7380

2、高可用

我们关闭主节点6380,然后查看。

在这里插入图片描述
查看集群中各节点情况,6380显示fail。而7380已经变成了master节点了。

现在从缓存中读取前面缓存的4个值,虽然是异常提示:127.0.0.1:6380连接失败,但还是能获取到缓存内的值。(这里的异常是因为执行Test方法时,集群配置中有这台机器,初始化时连接不上的异常。若是一般在运行中的web项目不会出现这样的异常)
在这里插入图片描述
再次将6380启动起来后,6380变成了slave从节点。
6380启动日志:

[20520] 16 Jan 14:46:39.163 # Server initialized
[20520] 16 Jan 14:46:39.163 * DB loaded from append only file: 0.000 seconds
[20520] 16 Jan 14:46:39.163 * Ready to accept connections
[20520] 16 Jan 14:46:39.164 # Configuration change detected. Reconfiguring myself as a replica of c96d92167f25658f92b8e68fbe2cd641db0c9962
[20520] 16 Jan 14:46:39.164 * Before turning into a replica, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
[20520] 16 Jan 14:46:39.165 # Cluster state changed: ok
[20520] 16 Jan 14:46:40.253 * Connecting to MASTER 127.0.0.1:7380
[20520] 16 Jan 14:46:40.253 * MASTER <-> REPLICA sync started
[20520] 16 Jan 14:46:40.256 * Non blocking connect for SYNC fired the event.
[20520] 16 Jan 14:46:40.256 * Master replied to PING, replication can continue...
[20520] 16 Jan 14:46:40.258 * Trying a partial resynchronization (request 3ce7caf46b989d9524c450b595a19e5d0c82b868:1).
[20520] 16 Jan 14:46:40.280 * Full resync from master: 609626e133d8d053640826b2da85b3789ed7ec02:5125
[20520] 16 Jan 14:46:40.280 * Discarding previously cached master state.
[20520] 16 Jan 14:46:40.419 * MASTER <-> REPLICA sync: receiving 419 bytes from master
[20520] 16 Jan 14:46:40.421 * MASTER <-> REPLICA sync: Flushing old data
[20520] 16 Jan 14:46:40.426 * MASTER <-> REPLICA sync: Loading DB in memory
[20520] 16 Jan 14:46:40.427 * MASTER <-> REPLICA sync: Finished with success
[20520] 16 Jan 14:46:40.442 * Background append only file rewriting started by pid 18008
[20520] 16 Jan 14:46:40.578 * AOF rewrite child asks to stop sending diffs.
[20520] 16 Jan 14:46:40.687 # fork operation complete
[20520] 16 Jan 14:46:40.697 * Background AOF rewrite terminated with success
[20520] 16 Jan 14:46:40.698 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
[20520] 16 Jan 14:46:40.700 * Background AOF rewrite finished successfully

在这里插入图片描述

相关文章:

SpringBoot Redis入门(四)——Redis单机、哨兵、集群模式

单机模式&#xff1a;单台缓存服务器&#xff0c;开发、测试环境下使用&#xff1b;哨兵模式&#xff1a;主-从模式&#xff0c;提高缓存服务器的高可用和安全性。所有缓存的数据在每个节点上都一致。每个节点添加监听器&#xff0c;不断监听节点可用状态&#xff0c;一旦主节点…...

获取数组中的第一个、第二个、第三个......元素

常规操作可以直接使用索引&#xff08;下标&#xff09;获取&#xff1a; const arr [5,8,6,9,10] const first arr[0] //5 const second arr[1] //8 const third arr[2] //6 不使用索引&#xff0c;如何获取&#xff1a; const [first] [5,8,6,9,10] //…...

前端面试题(持续更新~~)

文章目录 一、基础1、数组常用的方法2、数组有哪几种循环方式&#xff1f;分别有什么作用&#xff1f;3、字符串常用的方法4、原型链5、闭包6、常见的继承7、cookie 、localstorage 、 sessionstrorage区别8、数组去重方法9、http 的请求方式10、数据类型的判断方法11、cookie …...

ubuntu下无法访问和ping通github的一种解决方法

近期在ubuntu下突然无法访问github了&#xff0c;ping也无法ping通&#xff0c;尝试过更换不同的网络也无济于事。后来在https://blog.csdn.net/weixin_48544978/article/details/133899687 这个文章中找到了解决办法。 运气比较好&#xff0c;只按照文章中的第一步将http://…...

C#,入门教程(28)——文件夹(目录)、文件读(Read)与写(Write)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(27)——应用程序&#xff08;Application&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/125094837 C#知识比你的预期简单的多&#xff0c;但也远远超乎你的想象&#xff01; 与文件相关的知识&#xf…...

开源大数据集群部署(六)Keytab文件生成

作者&#xff1a;櫰木 Keytab文件用于在不输入密码的情况下对主体&#xff08;用户或服务&#xff09;进行身份验证。以下是创建Kerberos身份验证的步骤。 1、创建keytab文件 除了使用明文密码登录之外&#xff0c;Kerberos还可以使用keytab密码文件登陆&#xff0c;现在为te…...

图神经网络X项目|基于图神经网络的电商行为的预测(5%)

文章目录 Jupyter Notebook 学习人工智能的好帮手数据集数据集下载数据集调用数据集应用技巧——获取不重复的编号数据集应用技巧——随机采样数据集应用技巧——抽取前N项进行模拟测试 数据集构建技巧一——查看数据集构建进度 Jupyter Notebook 学习人工智能的好帮手 【Jupy…...

仰暮计划|“说是操场,那就是个土坡,我们在那儿上边种种树啊,拔拔草,有的时候还会有同学来喂喂羊啥的,这都是我们的娱乐”

我是1948年农历二月份在河南省许昌市五女店镇的一个乡村里边出生的。从我记事的时候&#xff0c;中华人民共和国就已经成立了。当时是好多年&#xff0c;经历了三大改造呀、生产队呀、大队呀&#xff0c;乱七八糟的很多&#xff0c;估计你们现在这些孩子们啊&#xff0c;都没有…...

Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享

1.感谢 感谢小伙伴儿的分享&#xff1a; ● 不羁 ● 郭中天 整合调整后的工具类Gitee地址&#xff1a;https://gitee.com/yuanzhengme/java_application_aspose_demo 2.包含的工具类 ● WordToPdfUtil用于将word文档转换为pdf格式的工具类 ● ExcelToPdfUtil用于将excel文档…...

8亿日活的抖音,用“自我设限”谋求长期主义

文&#xff5c;新熔财经 作者&#xff5c;寒蝉鸣 随着手机近乎全民化的普及&#xff0c;在互联网上“冲浪”的人是越来越多了。 根据QuestMobile发布的《中国互联网核心趋势年度报告&#xff08;2023&#xff09;》&#xff0c;2023年&#xff0c;中国移动互联网月活跃用户规…...

Final Cut Pro v10.7.1中文版 专业级视频剪辑软件 兼容M

Final Cut Pro 是 macOS平台上最好的视频剪辑软件&#xff0c;基于Cocoa编写&#xff0c;支持多路多核心处理器&#xff0c;支持GPU加速&#xff0c;支持后台渲染&#xff0c;可编辑从标清到4K的各种分辨率视频&#xff0c;ColorSync管理的色彩流水线则可保证全片色彩的一致性。…...

Chrome扩展之通信

Chrome扩展通信 chrome扩展的5种js js类型介绍popup单击插件图标后的弹窗中的js&#xff0c;由于单击图标打开popup&#xff0c;焦点离开又立即关闭&#xff0c;生命周期一般很短。content-script与页面共享DOM&#xff0c;但是不共享JS&#xff0c;可访问部分chrome扩展API。…...

Appium 环境配置

Appium 是一个开源的、跨平台的测试框架&#xff0c;可以用来测试 Native App、混合应用、移动 Web 应用&#xff08;H5 应用&#xff09;等&#xff0c;也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念&#xff1a; •无需用户对 App 进行任何修改或…...

前端JavaScript篇之Javscript数组的常用方法有哪些?JavaScript判断数组的方式有哪些?

目录 Javscript数组的常用方法有哪些&#xff1f;JavaScript判断数组的方式有哪些&#xff1f;1. Array.isArray() 方法&#xff1a;2. instanceof 操作符&#xff1a;3. Object.prototype.toString.call() 方法&#xff1a;4. Array.from() 方法&#xff1a; Javscript数组的常…...

【Spring Boot 3】【Redis】基本数据类型操作

【Spring Boot 3】【Redis】基本数据类型操作 背景介绍开发环境开发步骤及源码工程目录结构 背景 软件开发是一门实践性科学&#xff0c;对大多数人来说&#xff0c;学习一种新技术不是一开始就去深究其原理&#xff0c;而是先从做出一个可工作的DEMO入手。但在我个人学习和工…...

[MySQL]关于表的增删改查

目录 1.插入 1.1单行数据全列插入 1.2多行插入&#xff0c;指定列插入 ​编辑2.查询 2.1全列查询 2.2指定列查询 3.3查询字段为表达式 2.4别名 ​编辑2.5去重 2.6排序 2.7条件查询 2.7.1基本查询: 2.7.2 AND 和OR 2.7.3范围查询 2.7.4模糊查询 2.7.5分页查询 limit …...

编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)

一、翻译环境和运行环境​ 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。​ 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。​ 第2种是执行环境&#xff0c;它用于实际执行代码。​ VS中编译器&#xff1a;cl.exe &#xff1b;Linux中…...

洛谷 P1364 医院设置

题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c;相邻接点之间的距…...

JAVAEE初阶 网络编程(三)

TCP回显服务器 一. TCP的API二. TCP回显服务器的代码分析三. TCP回显服务器代码中存在的问题四. TCP回显服务器代码五. TCP客户端的代码六.TCP为基准的回显服务器的执行流程 一. TCP的API 二. TCP回显服务器的代码分析 这的clientSocket并不是表示用户端的层面东西&#xff0c;…...

Linux 的提示符太长了,帮你精简一下

普通用户修改文件 ~/.bashrc 修改 50 行左右的代码&#xff0c;将两个w改为大写的W 如果是root用户则修改文件/root/.bashrc&#xff0c;同样的方法。...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...