黑马Redis笔记-高级篇

news2024/12/24 22:14:48

黑马Redis笔记-高级篇

  • 1、Redis持久化(解决数据丢失)
    • 1.1 RDB持久化
      • 1.1.1 定义
      • 1.1.2 异步持久化bgsave原理
    • 1.2 AOF持久化
    • 1.3 RDB和AOF比较
  • 2、Redis主从(解决并发问题)
    • 2.1 搭建主从架构
    • 2.2 主从数据同步原理
      • 2.2.1 全量同步
      • 2.2.2 增量同步
  • 3、Redis哨兵(解决故障恢复问题)
    • 3.1哨兵的作用和原理
    • 3.2搭建哨兵集群
    • 3.3RedisTemplate的哨兵模式
  • 4、Redis分片集群(增强存储能力)
    • 4.1 搭建分片集群
    • 4.2 散列插槽
    • 4.3 集群伸缩
    • 4.4 故障转移
      • 4.4.1 自动故障转移
      • 4.4.2 手动故障转移
    • 4.5 RedisTemplate访问分片集群

在这里插入图片描述


1、Redis持久化(解决数据丢失)

1.1 RDB持久化

1.1.1 定义

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

RDB执行时机:

  1. Redis停机时会执行一次RDB。 (save命令由Redis主进程来执行RDB,会阻塞所有命令;bgsave命令则开启子进程执行RDB,是异步的,避免主进程受到影响)在这里插入图片描述

  2. Redis内部有触发RDB的机制,可以在redis.conf文件中找到。在这里插入图片描述

1.1.2 异步持久化bgsave原理

RDB方式bgsave的基本流程?

  1. fork主进程得到一个子进程,共享内存空间
  2. 子进程读取内存数据并写入新的RDB文件
  3. 用新RDB文件替换旧的RDB文件。

fork采用的是copy-on-write技术:
当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,则会拷贝一份数据,执行写操作。
在这里插入图片描述

RDB会在什么时候执行?save 60 1000代表什么含义?
默认是服务停止时执行。也可以配置config文件触发执行。
save 60 1000代表60秒内至少执行1000次修改则触发RDB

RDB的缺点?
RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
fork子进程、压缩、写出RDB文件都比较耗时

1.2 AOF持久化

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
在这里插入图片描述
在这里插入图片描述

1.3 RDB和AOF比较

在这里插入图片描述
在这里插入图片描述


2、Redis主从(解决并发问题)

2.1 搭建主从架构

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
因为根据经验,对Redis的操作大部分都是读,写操作占少数,所以在集群中采用读写分离,同时以少量主节点和大量从节点搭配,大大提升Redis的读取性能。主节点需要注意的就是数据同步如何同步给从节点。
在这里插入图片描述

在同一台服务器上搭建集群的步骤:
1、安装Redis,这里不赘述,博主的redis是在云服务器上利用宝塔面板自动安装的,默认安装在/www/server/redis目录下。
2、这里我会在同一台服务器上开启3个redis实例,模拟主从集群,端口为7001、7002、7003。
3、准备实例和配置。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。我在/tmp/目录下分别创建了7001、7002、7003三个子目录。# 创建目录 mkdir 7001 7002 7003
4、检查原始/www/server/redis/redis.conf文件中,持久化模式保持为默认的RDB模式,AOF保持关闭状态。
5、然后将/www/server/redis/redis.conf文件拷贝到/tmp/7001、/tmp/7002、/tmp/7003三个目录中
6、修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录,具体执行命令详见黑马的资料
7、虚拟机本身有多个IP,为了避免将来混乱,我们需要在redis.conf文件中指定每一个实例的绑定ip信息(这里我直接将ip全部设置为云服务器ip)
8、由于我的数据库设置了数据库,在后续开启主从关系会出现主节点使用info replication查到的connected_slaves是0的情况。因此需要在从节点的配置文件中添加一行masterauth 自己的密码

集群搭建成功:
在这里插入图片描述

红色框验证数据同步,绿色框验证读写分离(只有主节点能写入)
在这里插入图片描述

2.2 主从数据同步原理

2.2.1 全量同步

主从第一次同步是全量同步
在这里插入图片描述
在这里插入图片描述
全量同步:
在这里插入图片描述
在这里插入图片描述

2.2.2 增量同步

但如果slave重启后同步,则执行增量同步
在这里插入图片描述
在这里插入图片描述

主-从-从链式结构示意图:
在这里插入图片描述
在这里插入图片描述


3、Redis哨兵(解决故障恢复问题)

3.1哨兵的作用和原理

在这里插入图片描述
1、服务状态监控
在这里插入图片描述
2、选举新的master
在这里插入图片描述
3、如何实现故障转移
在这里插入图片描述
在这里插入图片描述

3.2搭建哨兵集群

搭建哨兵集群流程(基于上文搭建的Redis集群搭建):
1、在/tmp/下创建s1,s2,s3三个目录mkdir s1 s2 s3
2、在s1,s2,s3目录下创建sentinel.conf,写入哨兵配置信息,这部分参见黑马资料(因为我的redis设置了密码,所以sentinel.conf中需要添加sentinel auth-pass mymaster(集群名称) 密码
3、在/tmp/下执行redis-sentinal s1/sentinel.conf或者redis-server s1/sentinrl.conf --sentinel启动哨兵sentinel,三台都要启动,此时哨兵已经监控了Redis集群(这里有大坑,本人的Redis集群时在云服务器上搭建的,要在安全组设置开启哨兵对应的端口,否则哨兵间不能进行通信,该情况表现为sentinel启动后日志出现+sdown sentinel 一串sentinelid...

哨兵启动:
红框表示监控的集群信息,该集群有三个节点7001,7002和7003,其中主节点是7001
绿框表示哨兵集群信息,还有两个哨兵分别在27002和27003端口
这些信息都会被记录在sentinel.conf中
在这里插入图片描述
测试节点恢复:
1、主观下线,客观下线

在这里插入图片描述
2、哨兵选主,因为只需要一个哨兵做故障恢复
在这里插入图片描述
3、重新选取新的主节点并更新配置
选取新的master -> 将新选取的主节点7003设置为slaveof no one -> 将原本的主节点7001关于主节点的配置删除 -> 将新的主节点广播给剩余节点(7002)
在这里插入图片描述
4、手动重启7001端口
启动后自动执行replicaof ip 7002 ,成为一个从节点,同时重新进行全量同步。

3.3RedisTemplate的哨兵模式

在这里插入图片描述1、在pom文件中引入redis的starter依赖:

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

2、然后在配置文件application.yml中指定sentinel相关信息:

spring:
  redis:
    password: 1234 #如果Redis有密码市一定要配置密码
    sentinel:
      master: mymaster #指定master名称
      nodes: # 指定Redis集群信息
        - ip地址:27001
        - ip地址:27002
        - ip地址:27003

3、配置主从读写分离(在启动类中)
在这里插入图片描述

@SpringBootApplication
public class RedisDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisDemoApplication.class, args);
    }

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

主从自动切换和读写分离由客户端自动完成。


4、Redis分片集群(增强存储能力)

在这里插入图片描述

4.1 搭建分片集群

1、在/tmp目录下删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录rm -rf 7001 7002 7003 # 删除旧的,避免配置干扰mkdir 7001 7002 7003 8001 8002 8003 #创建目录
2、在/tmp下准备一个新的redis.conf文件

port 7001
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/7001/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/7001
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 你的ip
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/7001/run.log
# 密码
# 连接到节点的密码
requirepass 你的密码
# 节点之间的互访访问的密码
masterauth 你的密码

3、将这个文件拷贝到7001、7002、7003、8001、8002、8003目录下:echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf # 执行拷贝
4、修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf # 修改配置文件
5、直接启动服务printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf # 一键启动所有服务
6、带密码的集群创建(后面加 -a 密码)redis-cli --cluster create ip地址:7001 ip地址:7002 ip地址:70039 ip地址:8001 ip地址:8002 ip地址:8003 --cluster-replicas 1 -a 密码
在这里插入图片描述
创建成功!(云服务器用户注意云服务器和宝塔都得开放端口17001,17002,17003,18001,18002,18003,这些是集群的总线端口。)

每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如7001,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为7001,那么另外一个需要开通的端口是:7001 + 10000, 即需要开启 17001。17001端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。

在这里插入图片描述
7、查询redis集群状态redis-cli -p 7001 -a 密码 cluster nodes

4.2 散列插槽

在这里插入图片描述
验证:redis-cli -c -p 7001 -a 密码
在这里插入图片描述
在这里插入图片描述

4.3 集群伸缩

在这里插入图片描述
【案例】
在这里插入图片描述
1、启动一个新的redis实例,端口为7004redis-server 7004/redis.conf(云服务器和宝塔面板放开7004 和 17004端口)
2、添加7004到之前的集群,并作为一个master节点redis-cli -a 密码 --cluster add-node ip地址:7004 ip地址:7001
3、给7004节点分配插槽,使得num这个key可以存储到7004实例redis-cli -a 密码 --cluster reshard ip地址:7001,这里执行时需要输入:转移到插槽数量,接受插槽的节点id,原始插槽节点id
在这里插入图片描述
【练习】删除7004这个实例
1、将7004节点上的所有插槽转移到其他节点上(我返回给7001)redis-cli -a 密码 --cluster reshard ip地址:7004
2、删除节点redis-cli -a 密码 --cluster del-node ip地址:7004 节点id

4.4 故障转移

4.4.1 自动故障转移

在这里插入图片描述

4.4.2 手动故障转移

在这里插入图片描述

4.5 RedisTemplate访问分片集群

在这里插入图片描述


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

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

相关文章

基于哈里斯鹰算法优化的核极限学习机(KELM)分类算法 -附代码

基于哈里斯鹰算法优化的核极限学习机(KELM)分类算法 文章目录 基于哈里斯鹰算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于哈里斯鹰算法优化的KELM4.测试结果5.Matlab代码 摘要&#xff1a;本文利用哈里斯鹰算法对核极限学习机(KELM)进行优化&#xff0c…

【小梦C嘎嘎——启航篇】基本语法格式:namespace ?

基本语法格式&#xff1a;namespace &#xff1f;&#x1f60e; 前言&#x1f64c;namespace 是什么&#xff1f;namespace 的意义何在&#xff1f; 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&…

springboot + vue 部署 阿里云云服务器 ECS

安装所需文件 安装mysql5.7 下载MySQL的yum源配置 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm安装MySQL的yum源 yum -y install mysql57-community-release-el7-11.noarch.rpm使用yum方式安装MySQL5.7&#xff08;下载需要点时间&#xf…

【 断电延时继电器 电源监视 导轨安装 JOSEF约瑟 HJZS-E202 AC220V】

品牌&#xff1a;JOSEF约瑟型号&#xff1a;HJZS-E202名称&#xff1a;断电延时继电器额定电压&#xff1a;110、220VDC/AC&#xff1b;100VAC触点容量&#xff1a;250V/5A功率消耗&#xff1a;≤4.2W返回系数&#xff1a;10%额定电压 系列型号&#xff1a; HJZS-E202断电延时…

4.4 栈实现及其应用

目录 栈 顺序栈 创建栈: 清空栈: 判断栈是否空 &#xff1a; 进栈 : 出栈 : 取栈顶元素: 栈 栈是限制在一端进行插入操作和删除操作的线性表&#xff08;俗称堆栈&#xff09; 允许进行操作的一端称为“栈顶” 另一固定端称为“栈底” 当栈中没有元素时称为“空栈”…

Robbin负载均衡详解及实践---SpringCloud组件(三)

Robbin负载均衡详解及实践 一 为什么使用Robbin&#xff1f;二 Robbin概念三 负载均衡实践1.启动eureka客户端2.启动多个provider服务&#xff0c;注册到eureka3.在consumer端配置负载均衡参数 四 Robbin源码剖析 一 为什么使用Robbin&#xff1f; 在Eureka详解及实践—Spring…

SAS初识

1、SAS常用工作窗口 “结果”&#xff08;Result&#xff09;窗口——管理SAS程序的输出结果&#xff1b; “日志”&#xff08;Log&#xff09;窗口——记录程序的运行情况&#xff1b; “SAS资源管理器”&#xff08;Explore&#xff09;窗口&#xff1b; “输出”&#xff0…

详解vue中的Object.defineProperty

如果想要age遍历的话 就设置属性 打印出来 发现有可以枚举的属性age 参考课程&#xff1a; 011_尚硅谷Vue技术_Object.defineProperty_哔哩哔哩_bilibili // 1.Vue中的数据代理&#xff1a; // 通过Vm对象来代理data对象中属性的操作&#xff08;读/写&#xff09; // 2…

STL容器 —— list 了解、接口使用,以及模拟实现list(部分常用接口)

注意 &#xff1a; 以下所有文档都来源此网站 &#xff1a; http://cplusplus.com/ 一、vector的介绍及使用 list文档的介绍&#xff1a;https://cplusplus.com/reference/list/list/ 1. vector 的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&…

python自动化测试工具selenium使用指南 ,绝对能帮到你

目录 概述 pythonselenium环境安装 使用selenium启动浏览器 selenium页面加载等待和检测 使用time.sleep()等待 使用implicitly_wait设置最长等待时间 使用WebDriverWait设置等待条件 检测document是否加载完成 selenium元素定位和读取 查找元素 dom元素交互 查找元…

地址族和数据序列

IP地址 为使计算机连接到网络并收发数据,必需向其分配IP地址。 IP地址分为两类。 IPv4 (Internet Protocol version 4)4字节地址族 IPv6 (Internet Protocol version 6)16字节地址族 IPv4与IPv6的差别主要是表示IP地址所用的字节数,目前通用的地址族为IPv4。 IPv6是为了应对20…

全面接入!ChatGPT杀进15个商业应用,让AI替你打工

ChatGPT API开放60多天&#xff0c;世界已经不是两个月前的样子了。 微软联合创始人比尔盖茨称GPT是“40多年来最革命性的技术进步”&#xff0c;英伟达创始人黄仁勋高呼&#xff1a;“我们正处于AI的iPhone时刻”&#xff0c;阿里董事会主席兼CEO张勇也说&#xff1a;“所有行…

经验总结:(Git 版本控制工具快速入门)

Git学习笔记 版本控制(版本迭代) 什么是版本控制 版本迭代&#xff0c;开发过程中&#xff0c;对项目各个阶段的版本的控制。 在开发过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本。 多人开发…

ADV7391BCPZ-ASEMI代理亚德诺ADV7391BCPZ原厂芯片

编辑-Z ADV7391BCPZ参数描述&#xff1a; 型号&#xff1a;ADV7391BCPZ VDD&#xff1a;1.8V VAA&#xff1a;3.3V 全驱动输出电流&#xff1a;34.6 mA 低驱动输出电流&#xff1a;4.3 mA 输出电容&#xff1a;10 pF 模拟输出延迟&#xff1a;6 ns DAC模拟输出倾斜&am…

x509证书-crl证书吊销

标准 CRL fields -- 版本、时间、证书序列号和扩展名 -- 都是在4.1节的ASN.1中定义的 -- AlgorithmIdentifier 在第 4.1.1.2 节中定义 以下各项描述了 X.509 v2 CRL 在 Internet PKI 中的使用。 关于签名值和验证 signatureValue 字段包含根据 ASN.1 DER 编码的 tbsCertList 计…

13-Vue技术栈之路由的使用

目录 1、路由相关理解1.1 vue-router 的理解1.2 对 SPA 应用的理解1.3 路由的理解1.4 路由分类 2、路由的基本使用2.1 实现效果&#xff1a;2.2 实现思路&#xff1a;2.3 实现步骤&#xff1a;2.4 具体代码2.5 几个注意点 3、多级路由&#xff08;嵌套路由&#xff09;4、路由的…

中科院学术专用版GPT Academic项目实现

【写在最前】要完成GPT 学术优化 (GPT Academic)这个项目需要一些值得注意的地方&#xff1a; chatGPT账户有余额且未过期&#xff01;&#xff01;&#xff01;有代理工具&#xff08;类似Clash&#xff09; 1、代码克隆 https://github.com/binary-husky/gpt_academic 根据…

Java后端调取微信小程序接口,创建微信小程序直播间

前提条件&#xff1a; 1.注册微信小程序 2.获取appId和secret秘钥 3.小程序具备直播权限 小程序直播开发文档网址 目录 1.创建和修改直播间 2.删除直播间 3.获取直播间分享二维码 1.创建和修改直播间 两个功能一起写&#xff0c;区别在于&#xff0c;修改的时候需要多一…

【数字化转型-05】数字化转型中战略驱动的利器——平衡计分卡

今年的4月19日&#xff0c; 华为第20届全球分析师大会上&#xff0c;华为孟晚舟在大会上发表了“初心如磐&#xff0c;奋楫笃行&#xff0c;共赢数字化未来”的主题演讲&#xff0c;其中分享了对数字化转型的三个核心洞见&#xff0c;首先&#xff0c;战略驱动是根本&#xff0…

Mojo:比 Python 快 35000 倍的 AI 编程语言

Mojo&#xff1a;比 Python 快 35000 倍的 AI 编程语言 Mojo是一门刚刚发布的面向 AI 开发人员的编程语言。 Mojo 被设计为 Python 的超集&#xff0c;所以如果你已经掌握了 Python&#xff0c;学习 Mojo 会很容易。关键是 Mojo 将 Python 的易用性与 C 语言的性能相结合&am…