Redis数据库(六):主从复制和缓存穿透及雪崩

目录

一、Redis主从复制

1.1 概念

1.2 主从复制的作用

1.3 实现一主二从

1.4 哨兵模式

1.4.1 哨兵的作用

1.4.2 哨兵模式的优缺点

二、Redis缓存穿透和雪崩

2.1 缓存穿透——查不到

2.1.1 缓存穿透解决办法

2.2  缓存击穿 - 量太大,缓存过期

2.2.1 缓存击穿的原因

2.2.2 缓存击穿解决办法

2.3 缓存雪崩

2.3.1 缓存雪崩成因

2.3.2 缓存雪崩解决办法


一、Redis主从复制

一般来说,用将Redis运用于工程项目中,只使用一台Redis是万万不可能的,原因如下:

  1. 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  2. 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储数据,一般来说,单台Redis最大使用内存不应该超过20G。

因此,便出现了主从复制。 

1.1 概念

        主从复制:指的是将一个Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点 (master/leader),后者称为从节点(slave/follower)。 数据的复制是单向的 ,只能从主节点到从节 点。Master以写为主,Slave以读为主。 默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或者没有从节点), 但一个从节点只能有一个主节点。从机只能读取数据不能写入,数据直接从主机得来!

1.2 主从复制的作用

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务冗余
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即 写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载。尤其是在写少读多的场景下,通过从节点分担读负载,可以大大提供Redis服务器的并发量。
  4. 高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实现的基础,因此说主从复制是Redis高可用的基础。

电商网站上的商品,一般都是一次上传,无数次浏览,也就是“多读少写”。对于这种场景,我们可 以使用如下的架构:

平时在redis数据库中设置的数据,关闭系统了,还能看见就是进行了持久化,把内存中的数据存到磁盘上,等重新启动数据库,再从磁盘中把数据拷到内存中。  

1.3 实现一主二从

         默认情况下,每台Redis服务器都是主节点 ,主需要配置从机就行!

实现一个主机两个从机,如下图所示:

如何在一台电脑上产生3个服务器?

先拷贝一份redis.conf配置文件,把里面的端口改了,然后再让服务器端使用这个配置文件登录:redis-server ./redis1.conf,这样就是用别的端口号登录的服务器端。如下图所示:

只配置从机,不需要配置主机!认老大!一主(6379)二从(6380,6381)

配置从机:

此时查看主机信息:

至此,便实现了一主两从的配置。真实的主从配置应该在配置文件中配置,这样的话是永久的,我们通过命令配置的是临时的!

1.4 哨兵模式

      自动选举老大的模式!

引入的原因:主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵)架构来解决这个问题。

       哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个单独的进程,作为进程,他 会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

1.4.1 哨兵的作用

  1. 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
  2. 当哨兵监测到Master宕机,会自动将Slave切换成Master,然后通过发布/订阅模式通知其他的从 服务器,修改配置文件,让它切换主机。

         然而一个哨兵进程对Redis服务器进程监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

1.4.2 哨兵模式的优缺点

二、Redis缓存穿透和雪崩

2.1 缓存穿透——查不到

          缓存穿透的就是用户想要查询一个数据,发现Redis中没有,也就是缓存没有命中,于是向持久层数据库发起查询,发现也没有这个数据,于是本次查询失败。当用户很多的情况下,缓存都没有命中,又 都去请求持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于缓存穿透。

       如上图:客户端请求的数据既不在缓存中,也不在数据库中,这样的请求会直接落到数据库上。当这种情况频繁发生时,会导致大量请求直接访问数据库,给数据库带来巨大的压力,甚至可能导致数据库崩溃。 

2.1.1 缓存穿透解决办法

解决方案1 -- 布隆过滤器

       在缓存之前增加布隆过滤器,以快速判断某个 key 是否可能存在,从而避免对不存在的 key 进行数据库查询。

实现方法

  • 在应用启动时,将所有可能存在的 key 加入布隆过滤器。
  • 查询时,首先通过布隆过滤器判断 key 是否存在,如果不存在则直接返回。

解决方案2--缓存空对象

将查询结果为空的数据也缓存起来,避免频繁查询同一个不存在的数据。

实现方法

  • 当数据库查询结果为空时,将结果(例如,null 或特殊值)缓存起来,并设置一个较短的过期时间(例如 5 分钟)。

2.2  缓存击穿 - 量太大,缓存过期

       缓存击穿(Cache Breakdown)是指缓存中某个热点数据(即频繁访问的数据)在过期的瞬间,有大量请求同时访问该数据,导致这些请求直接打到数据库上,给数据库带来巨大压力。与缓存穿透不同,缓存击穿的问题在于某个特定的热点数据的失效,而不是请求不存在的数据。

2.2.1 缓存击穿的原因

缓存击穿通常由以下原因引起:

  1. 热点数据失效:某个被频繁访问的数据在缓存中过期失效,而在该数据失效的一瞬间,有大量请求涌入。
  2. 缓存设置不合理:没有合理地设置缓存的过期时间或者没有采取必要的保护措施,导致热点数据过期时引发大量访问。

2.2.2 缓存击穿解决办法

解决方法1 -- 热点数据永不过期

      对于特别重要的热点数据,可以设置为永不过期,并通过异步线程或定时任务定期更新缓存中的数据。

实现方法

  • 设置缓存数据永不过期,同时通过异步线程或定时任务定期刷新缓存数据。

解决方案2 -- 加互斥锁

通过在缓存失效后,使用分布式锁或互斥锁来控制只有一个请求可以访问数据库并更新缓存,其他请求等待锁释放后再读取缓存。

实现方法

  • 当缓存失效时,尝试获取锁,如果获取成功则访问数据库并更新缓存。
  • 其他请求等待锁释放后再读取缓存。

      分布式锁: 使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得 分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁 的考验比较大

2.3 缓存雪崩

       缓存雪崩(Cache Avalanche)是指缓存中的大量数据在同一时间过期或缓存服务器宕机,导致大量请求直接落到数据库上,给数据库带来巨大压力,可能导致数据库崩溃。与缓存穿透和缓存击穿不同,缓存雪崩的问题在于大量缓存数据同时失效。

举例理解:在写文本的时候,马上 要到双十一零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。 那么到了凌晨一点钟的时候,这批商品的缓存就过期了。从而对这批商品的访问查询,都落到了后台数据库上,对于数据库而言,就会产生周期性的压力波峰。于是所有的请求都会达到存储层,存储层的调 用量会暴增,造成存储层也会宕机的情况。

2.3.1 缓存雪崩成因

  1. 缓存集中失效:大量缓存数据在同一时间过期。
  2. 缓存服务器宕机:缓存服务器不可用,导致所有请求直接访问数据库。

      其实集中过期,倒不是非常致命,比较致命的缓存雪崩,是缓存服务器某个节点宕机或断网。因为自 然形成的缓存雪崩,一定是在某个时间段集中创建缓存,这个时候,数据库也是可以顶住压力的。无非 就是对数据库产生周期性的压力而已。而缓存服务器节点的宕机,对数据服务器造成的压力是不可预估 的,很可能瞬间就把数据库压宕机。 

2.3.2 缓存雪崩解决办法

解决方案1 -- Redis高可用

使用高可用的缓存架构,如 Redis 集群、主从复制和哨兵模式,保证缓存服务的高可用性。

实现方法

  • 部署 Redis 集群,实现数据分片和高可用。
  • 使用 Redis 哨兵模式,实现自动故障转移和主从切换。

解决方案2 -- 限流降级

对请求进行限流保护,避免瞬间的大量请求打到数据库上。在必要时进行服务降级处理,返回默认值或错误信息。

实现方法

  • 使用限流算法(如令牌桶、漏桶)对请求进行限流保护。
  • 在缓存失效或服务器压力过大时,进行服务降级处理。

解决方案3 -- 数据预热

       在系统启动时,提前将热点数据加载到缓存中,避免在流量高峰期缓存失效。数据预热的含义就是在正式部署之前,先把可能的数据先预先访问一遍,这样部分可能大量访问的数 据就会加载到缓存中,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间, 让缓存失效的时间点尽量均匀。

至此,Redis数据库的介绍就基本介绍完毕,感谢阅读本专栏,如果喜欢,点赞加关注!

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

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

相关文章

高频面试题基本总结回顾2(含笔试高频算法整理)

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

如何快速解决验证码图像问题 | 最佳图像(OCR)验证码解决工具

你是否曾经遇到过陷入一个看似无尽的 CAPTCHA 挑战中,努力识别扭曲的字符或数字?这些令人抓狂的 CAPTCHA 是为了确保你是人类而不是机器人,但它们也给真正的用户带来了头痛。那么,有没有快速解决这些 CAPTCHA 图像的方法&#xff…

Vue-Ci搭建项目

项目创建 vue-cli 官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; 主要的功能 ● 统一的目录结构 ● 本地调试 热部署 ● 单元…

华为OD机试 - 石头剪刀布游戏(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

设备驱动框架之LED

文章目录 前言一、什么是驱动框架二、使用步骤1.注册LED设备2.卸载LED设备3.内核中申请内存4.container_of5.platform_get_drvdata 和 platform_set_drvdata6.module_platform_driver 三、驱动示例总结 前言 为了尽量降低驱动开发者难度以及接口标准化,就出现了设备…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,员工管理,房屋管理,缴费管理,车位管理,报修管理 工作人员账号功能包括:系统首页,维修…

数据库原理之数据库基本概念

目录 前言 基本概念 数据库完整性 前言 今天我们来看看数据库的基本概念,帮助大家对数据库有一点点最基本的了解 基本概念 4个基本概念 数据data:描述事物的符号,数据库中存储的基本对象。 数据库Database:长期存储在计算机…

基于JSP技术的旅游网站系统

开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:B/S架构,JSP技术 工具:Eclipse,Tomcat…

PostMan动态设置全局变量

1. 前言 在开发过程中调试接口,一般都会使用PostMan。 其中有几个变量可能是好几个接口共用的,就会出现频繁手动复制(ctrlc)、粘贴(ctrlv)的情况。 这个过程得非常留意,生怕复制错了,或删减了某些东西,导致接口报错。…

Open3D 显示带有强度的点云数据

目录 一、概述 1.1强度信息的意义 1.2应用场景 二、代码实现 三、实现效果 一、概述 在点云数据中,强度(Intensity)指的是激光雷达传感器在扫描环境时,每个点返回的反射强度值。这些强度值代表了激光脉冲返回的能量&#xff…

Houdini 通过wedge来做模拟参数对比 (PDG TOP)

我们的设定如下例子 这是个简单的布料悬挂的例子。上方两个角分别被固定住了,然后在distance约束下布料下垂。 我们现在的目的是想要对比不同的streach stiffness对模拟的影响。 第一步:找到stiffness参数,右键expression->edit expre…

基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

第一步:准备数据 12种宠物猫类数据:self.class_indict ["阿比西尼猫", "豹猫", "伯曼猫", "孟买猫", "英国短毛猫", "埃及猫", "缅因猫", "波斯猫", "布偶猫&q…

【uni-app学习手札】

uni-app(vue3)编写微信小程序 编写uni-app不必拘泥于HBuilder-X编辑器,可用vscode进行编写,在《微信开发者工具》中进行热加载预览, 主要记录使用uni-app过程中自我备忘一些api跟语法,方便以后编写查找使用…

论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址:Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而,检索器很难捕捉相关性,尤…

开发板以电脑为跳板连接互联网

标题 开发板以电脑为跳板连接互联网网络共享方式桥接方式 开发板以电脑为跳板连接互联网 分享下用网线直连电脑的开发板如何以电脑为跳板连接互联网的两个方法。 网络共享方式桥接方式 补充下,我的电脑连接的是无线网络,开发板和电脑是用网线进行连接的…

ComfyUI如何使用Face Detailer和ComfyI2I插件进行修脸

一.插件ComfyI2I使用 1.ComfyUI中调用Mask Ops 2.创建蒙版插件BBOX Detector(combined) 3.创建UltralyticsDetectorProvider 里面包含多个模型其中bbox/face_yolov8m.pt是针对脸部修复 4.组合后测试脸部蒙版识别是否正常 5.测试正常后调出Inpaint Segments,放大…

作 业 二

cs与msf权限传递 1、进入cs界面,首先来到 Cobalt Strike 目录下,启动 Cobalt Strike 服务端 2、用客户端进 3、建立监听 4、生成脚本文件 5、开启服务,让win_2012 下载木马文件并运行 6、显示已经获取到了win的权限 转到Metasploit Framework 7、进去m…

公益培训|半导体与集成电路项目制培训项目

关于我们 硬蛋产业学院,基于硬蛋创新(http://00400.HK)在芯片产业的资源和技术优势,引进全球领先的芯片应用技术,为国内培养芯片应用技术人才,助力芯片应用产业发展。 硬蛋产业学院在国家各主管部门、广东省、深圳市及社会各界的大…

pycharm工具回退键调出

pycharm工具调出回退键。 View->Appearance->Toolbar,即可调出 调不出的可以使用快捷键:ctrlalt向左箭头 但是这个快捷键容易和电脑屏幕旋转冲突。可将电脑的快捷键关掉,即可。 ctrlalt向上箭头:将屏幕旋转到正常(横向&am…

基于weixin小程序校园快递系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,订单管理,快递管理,快递记录管理,公告管理,基础数据管理 小程序功能包括:系统首页,…