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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alpine Linux 轻量级Linux 适合于 docker 容器镜像

Alpine Linux是创始于2010年4月及以前的、一款开源社区开发的、基于musl libc和BusyBox的轻量级Linux发行版&#xff1b;适合用来做路由器、防火墙、VPNs、VoIP 盒子以及服务器的操作系统。 Alpine 的意思是“高山的”。Alpine Linux 围绕 musl libc 和 busybox 构建。这使得它…

LockSupport详解

目录 LockSupport详解1、LockSupport简介LockSupport 类的构造方法LockSupport 类的属性Thread类的parkBlocker属性LockSupport 类的常用方法挂起线程的相关方法唤醒线程的相关方法unpark(Thread thread)方法注意点LockSupport使用示例判断park的条件建议使用while而不是if引出…

算法篇 滑动窗口 leetCode 水果成篮

水果成蓝 1.题目描述2.图形分析2.1原理解释2.2 怎么想出使用滑动窗口2.3 图形分析 3.代码演示 1.题目描述 2.图形分析 2.1原理解释 2.2 怎么想出使用滑动窗口 2.3 图形分析 3.代码演示

Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一

1.前言 在10.0的系统rom定制化开发中&#xff0c;在对于launcher3的一些开发定制中&#xff0c;在对hotseat的一些开发中&#xff0c;需要实现动态hotseat居中 的功能&#xff0c;就是在拖拽图标进入和拖出hotseat&#xff0c;都可以保持hotseat居中的功能&#xff0c;接下来分…

【Linux】基础I/O——理解ext2文件系统

我们到现在为止讲的都是打开的文件。现在我们讲讲没有打开的文件 如果一个文件没有被打开&#xff0c;那它就是在磁盘中被存储的&#xff0c;我们就要关心路径问题&#xff0c;存储问题&#xff0c;文件获取问题&#xff0c;那么操作系统是怎么处理这些问题的&#xff1f;不急…

配置SMTP服务器的要点是什么?有哪些限制?

配置SMTP服务器安全性如何保障&#xff1f;如何高效配置服务器&#xff1f; SMTP作为电子邮件发送的核心协议&#xff0c;其配置对于确保邮件的成功传递和安全至关重要。AokSend将详细介绍配置SMTP服务器的关键要点&#xff0c;帮助读者建立一个高效、安全的邮件发送系统。 配…

使用 Flask 3 搭建问答平台(三):注册页面模板渲染

前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a;在Ubuntu系统上部署Hallo&#x…

Python面试宝典第15题:岛屿数量

题目 在二维网格地图上&#xff0c;1 表示陆地&#xff0c;0 表示水域。如果相邻的陆地可以水平或垂直连接&#xff0c;则它们属于同一块岛屿。请进行编码&#xff0c;统计地图上的岛屿数量。比如&#xff1a;下面的二维网格地图&#xff0c;其岛屿数量为3。 基础知识 解决这类…

国产化低功耗HDMI转VGA方案,大量出货产品,广泛应用在显示器以及广告机产品

芯片描述&#xff1a; 兼具高性能和低成本效益的优点&#xff0c;是一款可以将高清视频 HDMI1.4 数字信号转换成 VGA 模拟信号输出的芯片。不需要提供外部电源&#xff0c;ICNM7301 就可以在正常模式下使用&#xff1b;ICNM7301 广 泛适用于各种市场系统和显示应用体系&#x…

Yum包下载

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

【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列预测|附代码数据

全文链接&#xff1a;https://tecdat.cn/?p37019 分析师&#xff1a;Haopeng Li 随着我国股票市场规模的不断扩大、制度的不断完善&#xff0c;它在金融市场中也成为了越来越不可或缺的一部分。 【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列…

新时代多目标优化【数学建模】领域的极致探索——数学规划模型

目录 例1 1.问题重述 2.基本模型 变量定义&#xff1a; 目标函数&#xff1a; 约束条件&#xff1a; 3.模型分析与假设 4.模型求解 5.LINGO代码实现 6.结果解释 ​编辑 7.敏感性分析 8.结果解释 例2 奶制品的销售计划 1.问题重述 ​编辑 2.基本模型 3.模…

【网络】Socket编程

文章目录 正确理解端口号理解源IP地址和目的IP地址认识端口号端口号和进程ID 理解Socket网络字节序socket编程接口创建socket套接字bind绑定套接字listen建立监听accept接受连接connect建立连接sendto发送数据接收数据close关闭套接字 sockaddr结构体 正确理解端口号 理解源IP…

使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试》&#xff08;作者&#xff1a;尚雷&#xff09;&#xff0c…

PHP宠物店萌宠小程序系统源码

&#x1f43e;萌宠生活新方式&#x1f43e; &#x1f3e1;【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店&#xff1f;现在&#xff0c;“宠物店萌宠小程序”就是你的秘密花园&#xff01;&#x1f31f;只需轻轻一点&#xff0c;就能瞬…

什么是股指期货交割?股指期货交割的例子

股指期货交割是指在股指期货合约到期时&#xff0c;投资者需要按照合约规定完成的结算过程。与一般的商品期货、国债期货或外汇期货不同&#xff0c;股指期货采用的是现金交割方式。 股指期货交割的方式 【现金交割】股指期货的交割不需要实际交割一篮子股票指数成分股。相反…

(社恐福音)用python写一个定时弹窗功能

背景 背景是换了一个工作&#xff0c;需要点外卖了 写代码太认真的时候又经常忘记 这时候就需要一个闹钟 手机闹钟声音太大 会影响他人 所以用python 写一个弹窗功能&#xff0c;只影响自己 效果图 原理 管理列表和定时功能通过windows自带的计划完成 python程序不用占用后台…

7月18日学习打卡,数据结构堆

hello大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不…

ARM架构(二)—— arm v7/v8/v9寄存器介绍

1、ARM v7寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样&#xff0c; 通用寄存器&#xff1a;31个 1.2 程序状态寄存器 CPSR是程序状态毒存器&#xff0c;保存条件标志位&#xff0c;中断禁止位&#xff0c;当前处理器模式等控制和状态位。每种异常模式下还存在SPSR&…