Redis系列-3 Redis缓存问题

news2024/11/28 16:34:46

1.缓存的作用

数据库(如Mysql)的持久化特点带来了较低的性能,高并发的场景下,连接池很快被耗尽而出现宕机或DOS,无法继续对外提供服务。相对于数据库的硬盘IO,缓存中间件基于内存进行读写,从而具备较大的吞吐量和高并发抵抗能力。

在服务器与数据库之间添加一层缓存,一方面可以缓解数据库压力,适应高并发场景;另一方面可以提高服务器的响应速度(内存读写速度远高于磁盘IO),具体流程如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Llifcjw-1714982408769)(C:\Users\0216001379\AppData\Roaming\Typora\typora-user-images\1714965497585.png)]
引入缓存后,服务器会先从缓存服务器查询,若数据不存在,才会从数据库查询,并将数据库查询结果写入缓存服务器。当数据被缓存至缓存服务器后,服务器后续直接从内存读取,不再经过数据库。

数据库中的数据都多写少,而且一般而言遵循二八定律,即20%为热点数据,80%为不常用数据。内存资源较为宝贵,所以希望缓存中尽可能多的是热点数据;过期时间、续期等机制为其提供了一个很好的解决方案。

Redis是缓存常用的方案,本文介绍的缓存服务器默认指Redis,数据库默认指代Mysql。Redis中以键值对的形式存放数据。Redis之所以可以保护Mysql,是因为过滤了绝大部分请求压力,当这部分压力透过Redis直接转移到Mysql时, 会导致Mysql服务宕机。有三种场景会导致这个问题,以下分章节进行介绍。

2.缓存穿透

当访问数据库中不存在的数据时,也不会将数据缓存到Redis中,从而每次请求都直接访问数据库,如同穿透了缓存一样。攻击者可以借此绕开Redis的缓存保护,供给服务器的数据库,如Mysql数据库的ID为自增序列时,高并发查询ID为-1的数据。

如下图所示,Redis和Mysql中不存在数据C,客户端高并发请求C数据时,请求会全部发送到Mysql中。

在这里插入图片描述
存在以下解决方案:

方案1:缓存空值
查询数据据库的结果为空时,在Redis中缓存空值并设置较短的有效时间。对于每个不存在的数据都缓存一个空值,可能导致Redis中缓存了大量无效的空值,占据内存空间;另外,在空值的有效期内,可能出现数据不一致情况(数据在数据库中被添加了)。

方案2:布隆过滤器
布隆过滤器基于Hash函数和长数组实现,特点是可能误判(不存在表示一定不存在,存在表示可能存在)和不可删除,当数据变化时,需要重建(定时器执行)布控过滤器。

使用布隆过滤器的流程如下:
初始化:
在这里插入图片描述

处理请求:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZZX3Xdt-1714982408771)(C:\Users\0216001379\AppData\Roaming\Typora\typora-user-images\1714982323034.png)]

在《Redis系列-1 Redis介绍》中对Redission库仅介绍了分布式锁API的使用方式,除此之外,Redission库还提供了大量分布式操作的API,如布隆过滤器等。

3.缓存击穿

Redis中存放的热点数据存在过期时间,当热点数据过期后,客户端的请求会穿过Redis直达数据库。如下所示,Redis中数据C是个热点数据,当数据C在Redis中过期而被清除后,高并发请求数据C时,请求会直达Mysql。
在这里插入图片描述

存在以下解决方案:

方案1:加分布式锁

查询数据库前,获取分布式锁,结合DCL可以保证每个热点数据仅有一次查询发送到数据库。

方案2:热点数据持续刷新

服务初始化时,将热点数据刷入Redis中,同时启动一个定时服务:定时更新热点数据的过期时间。另外,对于特殊业务场景下,可以设置热点数据永不过期。

3.缓存雪崩

当Redis中大量缓存过期或者Redis服务器宕机,会导致Redis对于这些数据的拦截失败,请求会发送到Mysql.
在这里插入图片描述

根据不同的原因,存在如下对应解决方案:

方案1:缓存预热
启动时进行缓存预热,将热点数据提前写入Redis缓存中,避免系统启动时高并发访问Mysql.

方案2:缓存时间添加随机值
缓存时间添加指定范围的随机值,防止缓存集中失效。

方案3:部署Redis集群
Redis宕机会导致缓存数据全局失效,可通过部署Redis集群提高可用性。

另外,还可通过添加分布式锁来压缩请求速度,从而给数据库争取处理时间;由于严重影响吞吐量,使用较少。

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

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

相关文章

Electron学习笔记(六)

文章目录 相关笔记笔记说明 七、系统5、托盘图标(1)、设置托盘图标(2)、托盘图标闪烁(3)、托盘图标菜单 6、剪切板(1)、写入剪切板(2)、读取剪切板 7、系统通知8、其他(1)、使用系统默认应用打开文件(2)、接收拖拽到窗口中的文件(3)、使用系统字体 相关笔记 Electron学习笔记&…

异常处理/CC++ 中 assert 断言 应用实践和注意事项

文章目录 概述assert 本质浅析Release版本下的assert是否生效默认设置下 QtCreator环境 assert 过程默认配置下 VS环境 assert 过程配置VS发布模式下的断言生效VS环境Release版本的UI程序Release下请当我不生效 请勿滥用assert导致逻辑错误再强调不要在assert内执行逻辑功能怎敢…

华为交换机配置导出备份python脚本

一、脚本编写思路 (一)针对设备型号 主要针对华为(Huawei)和华三(H3C)交换机设备的配置备份 (二)导出前预处理 1.在配置导出前,自动打开crt软件或者MobaXterm软件&am…

IEEE 802.11标准

在IEEE 802.11标准中使用了扩频通信技术,主要作用是使得抗干扰性更强。 IEEE 802.11在MAC层采用了CSMA/CA协议。 IEEE 802.1x是一种基于端口认证协议。

【数据分析面试】41.如何分析处理Netflix流失用户?(业务分析)

题目 假设有一百万 Netflix 用户在过去六个月内没有登录到 Netflix。 你会如何确定原因?以及你会如何处理这些用户? Netflix 是一家总部位于美国的全球性流媒体娱乐服务公司,提供在线视频点播服务。通过其网站和移动应用,用户可…

内容检索(2024.05.12)

随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此汇总并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态! 本期更新内容: 1. 信号仿真类话题-…

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起,目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开,可以将任何容器与任何算法结合使用,只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …

Android性能:高版本Android关闭硬件加速GPU渲染滑动卡顿掉帧

Android性能&#xff1a;高版本Android关闭硬件加速GPU渲染滑动卡顿掉帧 如果在Androidmanifest.xml配置&#xff1a; <application android:hardwareAccelerated"false" > 或者某个特点View使用代码&#xff1a; myView.setLayerType(View.LAYER_TYPE_SOFT…

【Python-爬虫】

Python-爬虫 ■ 爬虫分类■ 1. 通用网络爬虫&#xff1a;&#xff08;搜索引擎使用&#xff0c;遵守robots协议&#xff09;■ robots协议&#xff08;君子协议&#xff09; ■ 2. 聚集网络爬虫&#xff1a;自己写的爬虫程序 ■ urllib.request&#xff08;要导入的模块&#x…

字典是如何实现的?Rehash 了解吗?

字典是 Redis 服务器中出现最为频繁的复合型数据结构。除了 hash 结构的数据会用到字典外&#xff0c;整个 Redis 数据库的所有 key 和 value 也组成了一个 全局字典&#xff0c;还有带过期时间的 key 也是一个字典。(存储在 RedisDb 数据结构中) 字典结构是什么样的呢&#xf…

PDF Squeezer for Mac,让PDF压缩更高效

还在为PDF文件过大而烦恼吗&#xff1f;试试PDF Squeezer for Mac吧&#xff01;它拥有强大的压缩功能&#xff0c;可以快速将PDF文件压缩至更小的体积&#xff0c;让你的文件传输更快捷。同时&#xff0c;它还支持多种压缩方式&#xff0c;满足你的不同需求。赶快下载体验吧&a…

【机器学习300问】88、什么是Batch Norm算法?

一、什么是Batch Norm&#xff1f; &#xff08;1&#xff09;Batch Norm的本质 神经网络中的Batch Normalization&#xff08;批量归一化&#xff0c;简称BatchNorm或BN&#xff09;是一种改进神经网络训练过程的规范化方法&#xff0c;BatchNorm的主要目的是加速神经网络的训…

每日两题 / 23. 合并 K 个升序链表 94. 二叉树的中序遍历(LeetCode热题100)

23. 合并 K 个升序链表 - 力扣&#xff08;LeetCode&#xff09; 若lists有k个元素&#xff0c;调用k - 1次&#xff08;两个有序链表的合并&#xff09;即可 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNod…

【Delphi】OpenCV 实战(一):OpenCV简介及开发环境配置

目录 一、OpenCV 功能模块 二、Delphi 中使用OpenCV 三、OpenCV 4.7 Delphi开发环境配置 1. 环境配置 2. OpenCV 中Demo程序的编译配置 3. 运行 Demo (OpenCV for Delphi) OpenCV 是世界上最大的计算机视觉库。 它是开源的,包含 2500 多种算法,由非营利…

八、VUE内置指令

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 四、VUE事件处理 五、VUE计算属性 六、Vue监视属性 七、VUE过滤器 七、VUE内置指令 九、VUE组件 v-text 向其所在的节点中渲染文本内容。 (纯文本渲染)与插值语法的区别&#xff1a;v-text会替换掉节点中的内容&#xff0c;{{x…

技术爱好者必看:如何用AI问答API彻底改变用户体验!

AI 问答 API 对接说明 我们知道&#xff0c;市面上一些问答 API 的对接还是相对没那么容易的&#xff0c;比如说 OpenAI 的 Chat Completions API&#xff0c;它有一个 messages 字段&#xff0c;如果要完成连续对话&#xff0c;需要我们把所有的上下文历史全部传递&#xff0…

猫头虎分享已解决Bug || **Vue.js脚手架安装失败** Error: unable to fetch template`

猫头虎分享已解决Bug &#x1f42f; || Vue.js脚手架安装失败 &#x1f6ab;Error: unable to fetch template 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题…

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发&#xff0c; 当开发完成后&#xff0c;需要把开发的功能部署到测试环境供测试人员进行测试使用&#xff0c; 等测试人员测试通过后&#xff0c;我们会将项目部署到生成环境上线使用。 这个时…

Django——会话.CookieSession

Django——会话.Cookie&Session 一、Cookie 会话指的是浏览器与web服务器之间的通信。HTTP协议是无状态协议。web服务器无法知道用户上一次会话数据&#xff0c;用来维护用户在访问网站过程中的状态 &#xff0c; 会话控制使用 Cookie 和 Session 一起实现。 通常把 Ses…

maven远程仓库访问顺序

首先需要了解一下各个配置文件&#xff0c;主要分为三类&#xff1a; 全局配置文件(${maven.home}/conf/settings.xml)&#xff0c;maven安装路径下的/conf/settings.xml用户配置文件(%USER_HOME%/.m2/settings.xml)&#xff0c;windows用户文件夹下项目配置文件&#xff1a;p…