当前位置: 首页 > 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;同样的方法。...

开源监控面板OpenClaw:从架构设计到生产部署实战指南

1. 项目概述&#xff1a;一个开源监控面板的诞生 在运维和开发的世界里&#xff0c;监控面板就像是驾驶舱里的仪表盘。没有它&#xff0c;你就是在盲飞。今天要聊的这个项目 xingrz/openclaw-dashboard &#xff0c;就是一个由社区驱动的开源监控面板解决方案。它的名字很有意…...

CentOS8实战:ZeroTier构建安全异地虚拟局域网

1. 为什么选择ZeroTier替代传统内网穿透方案 最近在帮朋友搭建远程办公环境时&#xff0c;遇到了一个典型问题&#xff1a;分布在三个不同物理位置的服务器需要像在同一个办公室内网那样互相访问。最初考虑使用FRP方案&#xff0c;但实测下来发现几个痛点&#xff1a;首先是带宽…...

解锁端侧智能:基于BigDL-LLM与Qwen-1.8B-Chat的CPU高效推理实践

1. 为什么要在CPU上部署大模型&#xff1f; 最近两年大模型技术发展迅猛&#xff0c;但大多数应用都依赖昂贵的GPU服务器。我在实际项目中发现&#xff0c;很多中小企业和个人开发者其实更需要能在普通电脑上运行的轻量化方案。这就是为什么基于CPU的大模型部署方案变得越来越…...

AI智能体密钥安全管理:AgentVault架构解析与实战指南

1. 项目概述&#xff1a;一个为AI智能体打造的“保险箱”最近在折腾AI智能体&#xff08;Agent&#xff09;应用开发的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;如何安全、可靠地管理智能体运行过程中需要用到的各种密钥、凭证和敏感数据&#xff1f;无论是调用Op…...

Excel MCP Server终极指南:3步实现无界面Excel自动化处理

Excel MCP Server终极指南&#xff1a;3步实现无界面Excel自动化处理 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server 你是否厌倦了手动操作Excel的繁琐…...

一种用于并网光伏系统的创新型多层逆变器,以降低总谐波失真(THD)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 &#x1f381…...

多模态AI实战:基于OpenGVLab/Ask-Anything构建视觉问答系统

1. 项目概述&#xff1a;当视觉大模型学会“看图说话”最近在折腾多模态AI应用&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫OpenGVLab/Ask-Anything。简单来说&#xff0c;它就像一个给AI装上了“眼睛”和“嘴巴”的系统&#xff0c;你给它一张图片或一段视频&…...

终极游戏性能调优指南:DLSS Swapper智能管理工具深度解析

终极游戏性能调优指南&#xff1a;DLSS Swapper智能管理工具深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 游戏体验痛点剖析&#xff1a;当DLSS版本成为性能瓶颈 你是否曾在畅玩《赛博朋克2077》时&#xf…...

构建高可用AI模型代理服务:统一接口、智能路由与生产级部署

1. 项目概述&#xff1a;一个无处不在的AI助手接口最近在折腾AI应用开发的朋友&#xff0c;可能都遇到过这样一个痛点&#xff1a;想在自己的项目里快速接入一个靠谱的、能处理复杂对话的AI模型&#xff0c;但要么被OpenAI的API调用限制和网络问题搞得焦头烂额&#xff0c;要么…...

Arm Neoverse CMN-700互连架构与寄存器编程详解

1. Arm Neoverse CMN-700架构概览在现代高性能计算系统中&#xff0c;处理器核心数量的快速增长对互连架构提出了严峻挑战。作为Arm Neoverse平台的核心组件&#xff0c;CMN-700一致性互连网络采用创新的Mesh拓扑结构&#xff0c;解决了多核处理器间的通信瓶颈问题。我在实际芯…...