黑马Redis笔记高级篇 | 分布式缓存

news2024/11/29 18:48:46

黑马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/528154.html

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

相关文章

这样连交换机和路由器,多少网工没试过?

大家好&#xff0c;我是老杨。 交换机已经说过很多遍了&#xff0c;园区组网案例、交换机级联、光模块配件解读等等…… 有群友说想要看更多的配置案例&#xff0c;这次就给你说说&#xff0c;交换机和路由器对接上网配置。 还搞不明白交换机和路由器的&#xff0c;复习一下…

webpack开发服务器配置

&#x1f482; 个人网站:[【紫陌】【笔记分享网】](http://zimo.aizhaiyu.com/) &#x1f485; 想寻找共同学习交流、共同成长的伙伴&#xff0c;[请点击【前端学习交流群】](http://zimo.aizhaiyu.com/wechat/wechat.html) 文章最后有作者l联系方式&#xff08;备注进群&am…

写给程序员Android Framework 开发,

前言 在 Android 开发者技能中&#xff0c;如果想进大厂&#xff0c;一般拥有较好的学历可能有优势一些。但是如果你靠硬实力也是有机会的&#xff0c;例如死磕Framework。Framework 知识广泛应用在Android各个领域中&#xff0c;重要性显而易见。 成为一名Android Framework…

【2023程序员必看】大数据行业分析

1、政策重点扶持&#xff0c;市场前景广阔 2014年&#xff0c;大数据首次写入政府工作报告&#xff0c;大数据逐渐成为各级政府关注的热点。 2015年9月&#xff0c;国务院发布《促进大数据发展的行动纲要》&#xff0c;大数据正式上升至国家战略层面&#xff0c;十九大报告提…

网络突发环路,原来可以这么解决啊

大家好&#xff0c;我是老杨。 我相信&#xff0c;任何一个网工都遇到过网络环路&#xff0c;遇到这个情况&#xff0c;你的应对方法是什么&#xff1f; 我了解到大部分的初阶网工&#xff0c;最开始都只能用拔插网线和重启观测法来排除回路。 简单来说&#xff0c;就是先给…

下一个超级生态节点openGauss ——鲲鹏开发者峰会2023 openGauss技术专题回顾

摘要 2023年5月6日&#xff0c;一场面向计算产业开发者的技术盛会“ 鲲鹏开发者峰会2023 ”在东莞松山湖正式拉开帷幕&#xff0c;在其中的“openGauss技术专场”上&#xff0c;openGauss相关专家和伙伴围绕openGauss社区进展、openGauss5.0版本技术创新&#xff0c;基于op…

前端开发之函数式编程实践 | 京东云技术团队

作者&#xff1a;京东科技 牛志伟 函数式编程简介 常见应用场景 1、ES6中的map、filter、reduce等函数 [1,2,3,4,5].map(x > x * 2).filter(x > x > 5).reduce((p,n) > p n);2、React类组件 -> 函数式组件hooks、Vue3中的组合式API 3、RxJS、Lodash和Ramd…

震惊!百度搜索地位崩塌,微软Bing和俄罗斯Yandex上升

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 中国的搜索引擎市场正在发生巨变。据美国一家网站流量检测机构StatCounte显示&#xff1a;从2022年到2023年&#xff0c;百度的搜索流量份额急剧下降至39.64%&#xff0c;而微软的Bing和俄罗斯的Ya…

Spring Boot集成ShardingSphere配合dynamic-datasource进行数据源切换 | Spring Cloud 49

一、前言 通过以下系列章节&#xff1a; Spring Boot集成ShardingSphere实现数据分片&#xff08;一&#xff09; | Spring Cloud 40 Spring Boot集成ShardingSphere实现数据分片&#xff08;二&#xff09; | Spring Cloud 41 Spring Boot集成ShardingSphere实现数据分片&…

沉痛悼念互联网[云原生领域]技术大牛----左耳朵耗子(陈皓老师)

陈皓老师&#xff0c;网名"左耳朵耗子"&#xff0c;是一位在互联网界享有盛誉的伟大人物。他的一生充满了创造力、智慧和奉献精神&#xff0c;对技术领域做出了卓越的贡献。 陈皓老师 为什么网名叫 左耳朵耗子? 陈皓老师之所以取名"左耳朵耗子"&#xff…

HDMI接口说明

目录 一、概述 二、信号说明 三、信号定义 四、握手过程 五、调试步骤 一、概述 HDMI ,High-Definition Multimedia Interface,即高清晰度多媒体接口&#xff0c;是电脑、电视等相关显示设备的接口。 二、信号说明 HDMI分为Source,Sink.Source即信号源&#xff0c;为HDMI…

网络基础协议

1、网络协议/TCP/UDP/HTTP 网络协议是指在计算机网络中&#xff0c;不同设备之间进行通信时所使用的规则、约定和标准。常见的网络协议包括TCP协议、UDP协议、HTTP协议等。 TCP协议是一种面向连接、可靠的传输层协议&#xff0c;它提供了可靠的数据传输和数据包检错能力。在网…

新星计划2023【网络应用领域基础】——————Day3

常见的网络基础介绍 前言 我们系数了网络发展的历史和一些常见的协议&#xff0c;以下文章我将详细的讲网络层协议以及用拓扑来解释单臂路由和vlan的划分。结尾将会额外的额解释常见的抓包。 目录 常见的网络基础介绍​ 前言 我们系数了网络发展的历史和一些常见的协议&…

蓝桥杯拿到一等奖,并分享经验

昨天和群里的小伙伴在群里聊&#xff0c;有的小伙伴竟然说蓝桥杯一等奖没有含量&#xff0c;我也是醉了&#xff01; 就像去年看了一个号主写的&#xff1a;研究生遍地都是! 放眼全国14亿人口&#xff0c;别说研究生了&#xff0c;本科生占比有多少? “蓝桥杯是我人生中得到…

移动硬盘中剪切的文件能恢复吗?可尝试这四种方法找回

在使用移动硬盘时&#xff0c;我们所存储的数据很容易出现意外丢失、被删除、受到病毒感染等方方面面的问题。而如果你使用的是剪切操作&#xff0c;而不是复制操作来移动文件&#xff0c;那么在操作过程中很容易因为各种原因导致数据丢失。如果你遇到了这种情况&#xff0c;那…

持续熬夜爆肝,炸裂的OPEN AI 快速开发平台后台管理同步上线啦 ,完全免费聊天主题也即将上线

持续几天几夜晚&#xff0c;不眠不休的项目开发&#xff0c;终于完成第一版整 OPEN AI 快速开发平台API 和大家见面了&#xff0c;这次包含后台管理&#xff0c;用户开发者入住&#xff0c;和完整的接口文档 OPEN AI快速开发平台这里进入 连接上一篇文章 爆肝一周&#xff0…

【JAVA程序设计】(C00134)基于SSM(非maven)的在线餐饮管理系统

基于SSM&#xff08;非maven&#xff09;的在线餐饮管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 ssm在线餐饮管理系统 本项目包含管理员与普通用户两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,查看销售报表,餐桌管理,菜式管理,菜品…

【新星计划】数据库 CTE 初识

【新星计划】数据库 CTE 初识 CTECTE 语法 CTE 递归CTE 递归语法递归示例递归机制 几个CTE 递归的示例阶乘斐波那契序列无限级分类路径 rand 函数小结 CTE CTE指的是公共表表达式(Common Table Expression) 在日常我们使用数据库的时候&#xff0c;通常在一些数据汇总计算的时候…

京东商品详情数据接口采集技术,支持整站数据高并发采集

一、如何通过手动方式查看京东商品详情页面的数据 1.京东商品详情 API 接口&#xff08;item_get - 获得京东商品详情接口&#xff09;&#xff0c;京东API 接口代码对接可以获取到宝贝 ID&#xff0c;宝贝标题&#xff0c;价格&#xff0c;优惠价&#xff0c;掌柜名称&…

节卡率先冲刺科创板,协作机器人商业化正当时

日前&#xff0c;上交所新增受理节卡机器人股份有限公司科创板上市申请&#xff0c;该公司拟募集资金7.5亿元&#xff0c;国泰君安任保荐人。此前&#xff0c;节卡机器人共完成6轮融资&#xff0c;总融资额超14亿元。按照最后的一轮融资计算&#xff0c;公司引入软银愿景基金二…