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

Redis高级篇—分布式缓存

目录

Redis持久化

RDB持久化

AOF持久化

RDB与AOF对比

Redis主从

全量同步

增量同步 

Redis哨兵

RedisTemplate集成哨兵实现

Redis分片集群

散列插槽

集群伸缩

故障转移

自动故障转移

手动故障转移

RedisTemplate访问分片集群


Redis持久化

RDB持久化

        RDB全称Redis Database Backup file(Redis 数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据记录到磁盘中。当Redis实例故障重启后,会从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认保存在当前运行目录中。

RDB持久化会在以下四种情况下执行:
1. 执行save命令

save命令会让主进程执行RDB,执行期间所有其他命令都会被阻塞,该命令通常在数据迁移时才会用到。

2. 执行bgsave命令

执行bgsave命令后,系统会开启独立进程完成RDB,主进程可以持续处理用户请求,不受其影响。

3. Redis停机时
Redis停机时会自动执行一次save命令,实现RDB持久化。

4. 触发RDB条件时
Redis内部存在触发RDB的机制,可以在redis.conf文件中设置,格式如下。

# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1  
save 300 10  
save 60 10000 

RDB的其它配置也可以在redis.conf文件中进行设置。

# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes# RDB文件名称
dbfilename dump.rdb  # 文件保存的路径目录
dir ./ 

bgsave命令原理

        在Linux系统中,所有进程都无法直接操作物理内存,只能通过页表对物理内存进行操作。而bgsave执行时会fork主进程得到子进程,同时会将主进程的页表复制到子进程的页表中,因此子进程和主进程的页表是相同的,所以主进程和子进程从页表的映射层面实现了内存共享。
        于是子进程可以通过页表读取物理内存中的数据(读取的数据即主进程操作的数据),并将读取的数据存入磁盘中,替换旧的RDB文件。
        当主进程接收到请求,需要对数据进行写操作时,系统会对该数据进行拷贝,主进程可以对拷贝的数据副本进行读写操作,从而避免子进程在读数据时读到脏数据。在极端情况下,如果主进程对每个数据都进行写操作,那么每个数据都会被拷贝一次,内存将会翻倍,因此我们在开发时要给Redis预留足够的存储空间。


AOF持久化




RDB与AOF对比


Redis主从

全量同步

master如何判断slave是否是第一次进行同步数据?
这里会用到两个很重要的概念:
1.Replication ld:简称replid,是数据集的标记。若master与slave的replid一致,则说明主从属于同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid。
2.offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时会记录当前同步的offset。如果slave的offset小于master的offset,则说明slave数据落后于master,需要进行更新。因此slave进行数据同步时,必须向master声明自己的replication id和offset,master才可以判断需要同步哪些数据给slave。 

简述全量同步的流程
1.slave节点请求增量同步
2.master节点判断slave节点的replid,发现不一致,拒绝增量同步
3.master将完整的内存数据生成RDB,发送RDB到slave
4.slave清空本地数据,加载master的RDB
5.master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave


增量同步 


简述全量同步和增量同步区别?
全量同步:master将完整的内存数据生成RDB,发送RDB到slave。后续命令则记录在repl baklog,逐个发送给slave。
增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。

什么时候执行全量同步?
1. slave节点第一次连接master节点时;
2. slave节点断开时间太久,repl_baklog中的offset已经被覆盖时。

什么时候执行增量同步?
slave节点断开又恢复,并且在repl_baklog中能找到offset时。


Redis哨兵


选举新的master
一旦出现master故障,sentinel会选择一个salve作为新的master,选择依据如下。
1. 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds*10)则会排除该slave节点
2. 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
3. 如果slave-prority一样,则判断slave节点的sffset值,越大说明数据越新,优先级越高
4.最后是判断slave节点的运行id大小,越小优先级越高。

Sentinel的三个作用是什么?
1. 监控
2. 自动故障恢复
3. 通知

Sentinel如何判断一个redis实例是否健康?
每隔1秒向master发送一次ping命令,如果超过一定时间没有响应则认为该master是主观下线,如果大多数sentinel都认为该master主观下线,则判定master客观下线。

故障恢复步骤有哪些?
1. 选定一个slave作为新的master,并令其执行slave of no one命令
2. 让其它所有节点都执行slave of 新master命令
3. 修改故障节点配置,添加slave of 新master命令


RedisTemplate集成哨兵实现

        在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。以下是实现RedisTemplate集成哨兵机制的步骤。

1. 引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 在配置文件application.yml中指定redis的sentinel相关信息

spring:redis:sentinel:master: mymasternodes:- 192.168.150.101:27001- 192.168.150.101:27002- 192.168.150.101:27003

3. 在项目的启动类中,添加一个新的bean

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

这个Bean用于配置Redis主从节点的读写策略,包括以下四种:
MASTER:从主节点读取
MASTER_PREFERRED:优先从master节点读取,master不可用才读取slave
REPLICA:从slave节点读取
REPLICA _PREFERRED:优先从slave节点读取,所有的slave都不可用才读取master 


Redis分片集群


散列插槽

Redis如何判断一个key应该存放在哪个实例中?
1. Redis将16384个插槽分配给不同实例
2. 根据key的有效部分计算哈希值,对16384取余
3. 余数作为插槽位置,寻找该插槽位置所在实例即可

如何将同一类数据固定保存在同一个Redis实例中?
令这一类数据使用相同的有效部分,例如key都以{typeld}为前缀


集群伸缩


需求1:将7004端口实例添加进集群中
命令如下。

redis-cli --cluster add-node  192.168.150.101:7004 192.168.150.101:7001

反馈如下图所示,7004加入了集群,并且默认是一个master节点。

但是,可以看到7004节点的插槽数量为0,因此没有任何数据可以存储到7004上。


需求2:将数据num存储到7004节点中

因为数据key不是与节点绑定,而是与插槽绑定的,因此我们需要查看num的插槽是多少。

如上图所示,num的插槽为2765,因此我们可以将0~3000的插槽从7001转移到7004,命令格式如下。

建立连接。

反馈如下。

复制7004节点id。

输入id后反馈如下。

此处询问:你的插槽是从哪里移动过来的?
all:代表全部,也就是各个节点转移一部分
具体的id:目标节点的id
done:结束输入

这里我们要从7001获取,因此填写7001的id,输入done表示结束填写。

反馈如下。

输入yes,确定转移插槽。

再次输入命令,查看节点信息。


可以看到,3000个插槽转移成功。


故障转移

自动故障转移

我们运行命令停止一个redis实例 ,模拟一个节点宕机,观察集群的反应。
redis-cli -p 7002 shutdown

1. 首先是该实例与其它实例失去连接
2. 然后是疑似宕机

3. 最后是确定下线,自动提升一个slave为新的master

4. 当7002再次启动,就会变为一个slave节点了


手动故障转移


RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:
1. 引入redis的starter依赖
2. 配置分片集群地址
3. 配置读写分离
与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下。

spring:redis:cluster:nodes:- 192.168.150.101:7001- 192.168.150.101:7002- 192.168.150.101:7003- 192.168.150.101:8001- 192.168.150.101:8002- 192.168.150.101:8003

相关文章:

Redis高级篇—分布式缓存

目录 Redis持久化 RDB持久化 AOF持久化 RDB与AOF对比 Redis主从 全量同步 增量同步 Redis哨兵 RedisTemplate集成哨兵实现 Redis分片集群 散列插槽 集群伸缩 故障转移 自动故障转移 手动故障转移 RedisTemplate访问分片集群 Redis持久化 RDB持久化 RDB全称Re…...

c++端的类,作为组件在qml端使用

qml使用c端的类&#xff0c;作为组件在qml端使用 这个类必须继承QObject 这个类必须继承QObject #ifndef COLLISIONALARM_H #define COLLISIONALARM_H#include <QObject>class CollisionAlarm : public QObject {Q_OBJECT//这个宏就叫做反射机制&#xff0c;让qml端直接…...

Android 14 适配之 - 全屏 intent 通知

全屏 intent 通知 在 Android 11&#xff08;API 级别 30&#xff09;中&#xff0c;任何应用都可以在手机处于锁定状态时使用 Notification.Builder.setFullScreenIntent 发送全屏 intent。在 AndroidManifest 中声明 USE_FULL_SCREEN_INTENT 权限即可&#xff1b; 全屏 int…...

如何在 Vue 和 JavaScript 中截取视频任意帧图片

大家好&#xff01;今天我们来聊聊如何在 Vue 和 JavaScript 中截取视频的任意一帧图片。这个功能在很多场景下都非常有用&#xff0c;比如视频编辑、视频预览等。本文将带你一步步实现这个功能&#xff0c;并且会提供详细的代码示例。 准备工作 首先&#xff0c;我们需要一个…...

代码随想录学习 day54 图论 Bellman_ford 队列优化算法(又名SPFA) 学习

Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; 卡码网&#xff1a;94. 城市间货物运输 I 题目描述 某国为促进城市间经济交流&#xff0c;决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市&#xff0c;通过道路网络连接&#xff0c;网络中的道路仅允许从…...

递归遍历树结构,前端传入一整颗树,后端处理这个树,包括生成树的id和pid等信息,

递归逻辑 递归遍历树结构&#xff0c;将树结构转换list集合 并添加到 flowStepTree 集合 // 递归遍历树结构&#xff0c;将树结构转换list集合 并添加到 flowStepTree 集合private static void settingTree(ProductFlowStepVO node, Long parentId, String ancestors, List<…...

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协…...

postman使用旧版本报错version mismatch detected

卸载 postman又重装了别的版本&#xff0c;打开后遇到了这个报错&#xff0c;解决办法如下&#xff1a; 删除缓存文件 C:\Users\Administrator\AppData\Roaming\Postman 下载PostMan 提取码&#xff1a;6k51...

探索数据的隐藏维度:使用Scikit-Learn进行特征交互性预测

探索数据的隐藏维度&#xff1a;使用Scikit-Learn进行特征交互性预测 在机器学习中&#xff0c;特征交互性是指不同特征之间可能存在的复杂关系&#xff0c;这些关系对预测结果有着重要影响。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中广受欢迎…...

首个WebAgent在线评测框架和流程数据管理平台来了,GPT-4、Qwen登顶闭源和开源榜首!

在当今科技迅速发展的时代&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;正以前所未有的速度改变着我们与数字世界的互动方式。基于LLM的智能代理&#xff08;LLM Agent&#xff09;&#xff0c;从简单的信息搜索到复杂的网页操作&…...

UE TSharedPtr

文章目录 概述TSharedPtrTSharedPtr包含2部分 构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;移动构造构造拷贝构造移动构造 小结 概述 之前写过一篇c的智能指针的&#xff0c;这篇写下ue的。本质上来说是差不多的&#xff0c;可以简单看看。 TSharedPtr 如下图&…...

基于X86+FPGA+AI的远程医疗系统,支持12/13代 Intel Core处理器

工控主板&#xff1a;支持12/13代 Intel Core处理器&#xff0c;适用于远程医疗系统 顺应数字化、网络化、智能化发展趋势&#xff0c;国内医疗产业改革正在积极推进&#xff0c;远程医疗、智慧医疗等新模式新业态创新发展和应用&#xff0c;市场空间不断扩大&#xff0c;而基…...

微信小程序开发入门指南

文章目录 一、微信小程序简介二、微信小程序开发准备三、微信小程序开发框架四、微信小程序开发实例六、微信小程序开发进阶6.1 组件化开发6.2 API调用6.3 云开发 七、微信小程序开发注意事项7.1 遵守规范7.2 注意性能7.3 保护用户隐私 八、总结 大家好&#xff0c;今天将为大家…...

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码&#xff0c;集成了wordpress和开源版ripro主题&#xff0c;可以完美运营。 自带了5个多g的美图资源&#xff0c;让网站内容看起来非常大气丰富&#xff0c;可以快速投入运营。 这个代码包&#xff0c;原网站已经稳定运营多年&#xff0…...

MySQL:mysql的数据类型

MySQL 作为一个流行的关系型数据库管理系统&#xff0c;支持多种数据类型以满足不同的数据处理和存储需求。正确理解和使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。 MySQL 数据类型 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。…...

IPython魔法命令的深入应用

目录 IPython魔法命令的深入应用 一、魔法命令基础 1. 魔法命令的分类 2. 基本使用 二、高级应用技巧 1. 数据交互与处理 2. 交互式编程与调试 三、魔法命令的进阶操作 1. 自定义魔法命令 2. 利用魔法命令优化工作流程 四、总结与展望 IPython魔法命令的深入应用 IP…...

Yum包下载

1. 起因 内网有一台服务器需要升级php版本,维护的同学又不想二进制安装.服务器只有一个光盘的yum仓库 2. 解决方法 解决思路如下: 外网找一台机器配置php8.3.8的仓库外网服务器下载软件集并打包内网服务器上传并解压实现升级 2.1 下载php8.3.8仓库 配置php仓库 rootcent…...

数据结构代码

文章目录 线性表的插入线性表的删除单链表的建立栈的顺序存储队列的顺序存储串的顺序存储树的存储二叉树遍历前序遍历中序遍历后序遍历 二分法插入排序利用普里姆算法构造最小生成树 线性表的插入 #a: 列表&#xff0c;pos: 要插入的位置&#xff0c;key: 要插入的数据&#x…...

环信IM x 亚马逊云科技,助力出海企业实现可靠通讯服务

随着全球化进程的加速&#xff0c;越来越多的企业选择出海&#xff0c;拓展国际市场。然而&#xff0c;面对不同国家和地区的用户&#xff0c;企业在即时通讯方面遇到了诸多挑战。为了帮助企业克服这些困难&#xff0c;环信IM与亚马逊云科技强强联手&#xff0c;共同推出了一套…...

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;二D&#xff09; 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 等高线图使用filled.contour函数示例…...

go中map

文章目录 Map简介哈希表与Map的概念Go语言内建的Map类型Map的声明Map的初始化Map的访问Map的添加和修改Map的删除Map的遍历 Map的基本使用Map的声明与初始化Map的访问与操作Map的删除Map的遍历Map的并发问题实现线程安全的Map 3. Map的访问与操作3.1 访问Map元素代码示例&#…...

02-用户画像-技术架构+业务划分

技术架构 python开发 es flume 流数据读取写入kafka文件 kafka 消息队列 sqoop 将数据导入数仓hive StructureStream 动态画像的处理 SparkSQL 静态画像的处理 &#xff0c;批数据处理 读取kafka获取用户行为数据 fineBI 数据展示 业务划分 离线业务 静态画像 …...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号1

本来打算找到工作再整理高级的题库&#xff0c;但一直没什么面试机会。宅在家里也不知道干些什么。索性就把高级的题库整理出来了。也算有头有尾。高级的题库更新之后&#xff0c;专业性更强了&#xff0c;不是真正从事这一行的&#xff0c;很难做出来。本人就是个小菜鸡&#…...

敲详细的springboot中使用RabbitMQ的源码解析

这里介绍的源码主要是涉及springboot框架下的rabbitmq客户端代码&#xff08;具体在springframework.amqp.rabbit包下&#xff0c;区分一下不由springboot直接接管的spring-rabbit的内容&#xff09;&#xff0c;springboot基于RabbitMQ的Java客户端建立了简便易用的框架。 sp…...

《Nginx核心技术》第04章:生成缩略图

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…...

Web 3.0革新:社交金融与边玩边赚开启用户数据主权时代

目录 Web 3.0与社交商业模式 传统社交平台的问题 去中心化社交创新 Mirror&#xff1a;去中心化内容发布平台 Lens Protocol&#xff1a;去中心化社交图谱 Maskbook&#xff1a;隐私保护的社交方式 Web 3.0与与边玩边赚模式 经济模型解析 新商业模式的探索 Axie Infi…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 中文分词模拟器(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…...

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景 在实际的组网中&#xff0c;可能会遇到这样一个场景&#xff1a;在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备&#xff0c;使用 EIGRP 协议将网络的路由打通。但是后来网络扩容&#xff0c;增加了一批华为的设备&#…...

mysql8和mysql5版本在使用mybatis框架时的注意事项

mysql8和mysql5版本在使用mybatis框架时有些注意事项&#xff0c;两者的区别在于两处地方的设置。有一处未设置好&#xff0c;就会出现以下错误&#xff1a;java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Can…...

为什么要有指针和引用类型?

简单说&#xff0c;是为了必要的&#xff0c;且很基础的表达能力 &#xff08;描述能力&#xff09;。 0. 数据四要素&#xff1a;名、值、址、型 指针、引用的基础&#xff0c;就是在描述一个数据时&#xff0c;除了这个数据的“值”以外&#xff0c;引入了这个数据的“地址…...

融水县建设局网站/公司宣传软文

前端技术周刊 2018-06-09 前端快爆 生态更新 Git 发现一个关于 Submodule 的安全漏洞&#xff0c;将可能导致任意代码执行漏洞&#xff0c;将 Git 客户端升级到 2.17.1 即可避免这样的安全问题。? W3C 网络内容可访问性指南的 2.1 版本已经进入 W3C 的推荐状态&#xff0c;新版…...

网站开发软件下载/如何建立网站平台

文章目录槽点快捷键修改方法Visual Studio 转战 VSCode 啦槽点 用惯了eclipse方式的快捷键&#xff0c;所以一时接受不了Visual Studio 2017 的快捷键方式 原本注释快捷键&#xff1a; 注释&#xff1a; 先CTRLK&#xff0c;然后CTRLC取消注释&#xff1a; 先CTRLK&#xff…...

青岛新闻网官方网站/网站推广优化方式

单源最短路径 穿插一下我是如何建图的&#xff1a; 我采用的建图方式是邻接表&#xff1a;用vector数组进行实现 //我习惯与自己写结构体&#xff0c;当然也可以采用自带的pair struct edge{int v,w;//顶点和边的权值 }; //写一个初始化函数存图 edge make_edge(int _v,int _…...

web网站如何做负载均衡/公司网址怎么制作

【题目描述】 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 &#xff08;原题地址&#xff09; 【样例示例】 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff…...

个人相册网站建设报告/软文写作实训总结

CreateTime--2017年10月20日09:35:49 Author:Marydon js如何获取ip地址&#xff1f; 参考链接&#xff1a;http://www.cnblogs.com/lyWebstrat/p/6824022.html js是不可以直接获取ip通过调用API 的调用方法 实现方法&#xff1a;通过回调查看ip 腾讯的IP地址API接口地址&#…...

做招聘网站怎么办营业执照/友情网

超像素 (Super-Pixel) 是一种图像处理方法&#xff0c;旨在将图像分割成较小的、均匀的像素块&#xff0c;以便于进行进一步的分析和处理。 在 Python 中&#xff0c;你可以使用 scikit-image 库中的 segmentation 模块来实现超像素。你可以使用其中的 slic() 函数来将图像分割…...