redis中高并发问题

news2024/11/16 11:51:22

高并发问题

Redis 做缓存虽减轻了 DBMS 的压力,减小了 RT,但在高并发情况下也是可能会出现各
种问题的。

1 缓存穿透

当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透”
缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发的访问请求到达时,缓存穿透不
仅增加了响应时间,而且还会引发对 DBMS 的高并发查询,这种高并发查询很可能会导致
DBMS 的崩溃。
缓存穿透产生的主要原因有两个:一是在数据库中没有相应的查询结果,二是查询结果
为空时,不对查询结果进行缓存。所以,针对以上两点,解决方案也有两个:
 对非法请求进行限制
 对结果为空的查询给出默认值

2 缓存击穿

对于某一个缓存,在高并发情况下若其访问量特别巨大,当该缓存的有效时限到达时,
可能会出现大量的访问都要重建该缓存,即这些访问请求发现缓存中没有该数据,则立即到
DBMS 中进行查询,那么这就有可能会引发对 DBMS 的高并发查询,从而接导致 DBMS 的崩
溃。这种情况称为缓存击穿,而该缓存数据称为热点数据。
对于缓存击穿的解决方案,较典型的是使用“双重检测锁”机制。

3 缓存雪崩

对于缓存中的数据,很多都是有过期时间的。若大量缓存的过期时间在同一很短的时间
段内几乎同时到达,那么在高并发访问场景下就可能会引发对 DBMS 的高并发查询,而这将
可能直接导致 DBMS 的崩溃。这种情况称为缓存雪崩。
对于缓存雪崩没有很直接的解决方案,最好的解决方案就是预防,即提前规划好缓存的
过期时间。要么就是让缓存永久有效,当 DB 中数据发生变化时清除相应的缓存。如果 DBMS
采用的是分布式部署,则将热点数据均匀分布在不同数据库节点中,将可能到来的访问负载均衡开来

数据库缓存双写不一致(难点)

以上三种情况都是针对高并发读场景中可能会出现的问题,而数据库缓存双写不一致问
题,则是在高并发写场景下可能会出现的问题。
对于数据库缓存双写不一致问题,以下两种场景下均有可能会发生:

(1) “修改 DB 更新缓存”场景

对于具有缓存 warmup 功能的系统,DBMS 中常用数据的变更,都会引发缓存中相关数
据的更新。在高并发写请求场景下,若多个请求要对 DBMS 中同一个数据进行修改,修改后
还需要更新缓存中相关数据,那么就有可能会出现缓存与数据库中数据不一致的情况。
在这里插入图片描述

(2) “修改 DB 删除缓存”场景

在很多系统中是没有缓存 warmup 功能的,为了保持缓存与数据库数据的一致性,一般
都是在对数据库执行了写操作后,就会删除相应缓存。
在高并发读写请求场景下,若这些请求对 DBMS 中同一个数据的操作既包含写也包含读,
且修改后还要删除缓存中相关数据,那么就有可能会出现缓存与数据库中数据不一致的情况。
在这里插入图片描述

(3) 解决方案:延迟双删

延迟双删方案是专门针对于“修改 DB 删除缓存”场景的解决方案。但该方案并不能彻
底解决数据不一致的状况,其只可能降低发生数据不一致的概率。
延迟双删方案是指,在写操作完毕后会立即执行一次缓存的删除操作,然后再停上一段
时间(一般为几秒)后再进行一次删除。而两次删除中间的间隔时长,要大于一次缓存写操
作的时长。
在这里插入图片描述

(4) 解决方案:队列

以上两种场景中,只所以会出现数据库与缓存中数据不一致,主要是因为对请求的处理
出现了并行。只要将请求写入到一个统一的队列,只有处理完一个请求后才可处理下一个请
求,即使系统对用户请求的处理串行化,就可以完全解决数据不一致的问题。

(5) 解决方案:分布式锁

使用队列的串行化虽然可以解决数据库与缓存中数据不一致,但系统失去了并发性,降
低了性能。使用分布式锁可以在不影响并发性的前提下,协调各处理线程间的关系,使数据
库与缓存中的数据达成一致性。
只需要对数据库中的这个共享数据的访问通过分布式锁来协调对其的操作访问即可。

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

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

相关文章

JVM的内存模型

一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域,以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧(Stack …

排序算法——希尔排序

一、介绍: 希尔排序是一种可以减少插入排序中数据比较次数的排序算法,加速算法的进行,排序的原则是将数据区分为特定步长的小区块,然后以插入排序算法对小区块内部进行排序,经历过一轮排序则减少步长,直到所有数据都排…

9月客户文章盘点——累计IF 103.2

客户文章一览 凌恩生物以打造国内一流生物公司为目标,在科研测序领域深耕不辍,吸纳多名在生物信息高级技术人员的加盟,参与并完成多个高科技项目。现已在宏组学、基因组、表观遗传以及蛋白代谢等多组学及联合分析领域积累了深厚经验&#xf…

加密市场陷入钝感期!“等鱼咽气”不可行,定投才是明智之选!

现在整个币圈的市场环境,像极了“在菜市场等鱼咽气”。许多主流加密货币波动率持续下降,锁仓不动的长期筹码占比缓慢抬升,短期投资者反复追高割肉,市场陷入了一种上不去下不来的钝感中。 从筹码层面来看,可以发现比特币…

Redis-02单机数据库的实现

Redis-02单机数据库的实现 1、服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库; 在初始化服务器时&#xff0c…

易点易动固定资产管理系统: 帮助您应对2023年年终固定资产大盘点

作为一名企业的行政人员,我们都了解年终固定资产盘点对于企业来说至关重要。然而,面对众多资产、复杂的流程和繁琐的记录工作,往往会令人感到头疼不已。为了帮助您应对2023年的年终固定资产大盘点,我们推荐易点易动固定资产管理系…

Flink实现kafka到kafka、kafka到doris的精准一次消费

1 流程图 2 Flink来源表建模 --来源-城市topic CREATE TABLE NJ_QL_JC_SSJC_SOURCE ( record string ) WITH (connector = kafka,topic = QL_JC_SSJC,properties.bootstrap.servers = 172.*.*.*:9092,properties.group.id = QL_JC_SSJC_NJ_QL_JC_SSJC_SOURCE,scan.startup.mo…

SpringBoot集成WebSocket讲解

文章目录 1 WebSocket1.1 简介1.2 WebSocket作用和调用1.2.1 作用1.2.2 js端调用 1.3 Javax1.3.1 服务端1.3.1.1 服务端接收1.3.1.2 服务端集成1.3.1.3 ping和pong消息 1.3.2 客户端1.3.2.1 客户端接收1.3.2.2 客户端发送 1.4 WebMVC1.4.1 服务端1.1.4.1 服务端接收1.1.4.2 服务…

Amber中的信息传递——章节1.1-第一部分

了解 AmberTools 从何处开始,这主要是管理软件包中信息传递的问题,请参见图 1.1。首先需要了解模拟程序(sander、pmemd、mdgx 或 nab)需要哪些信息。 您需要知道这些信息从何而来,又是如何以这些程序所需的形式出现的。…

好看的水滴登录页面

css 如何绘制水滴 可以通过box-shadow 来显示阴影可以通过border-radius 改变水滴的形状当然如果像要使其更加灵活,可以使用animationkeyframes关键帧border-radius,让水滴动起来 是不是很简单 来吧展示效果 html代码,就只有一个div,然后使…

在宝塔面板环境下安装nps服务端

在宝塔面板环境下安装nps服务端 一、所需环境二、开始安装三、打开nps控制台四、更改默认账号密码和连接秘钥五、反向代理挂载SSL证书 一、所需环境 阿里云轻应用服务器(选择宝塔应用镜像)域名(最好也是阿里注册的域名)对应的ssl…

RT-Thread 中断管理(学习三)

中断与轮询 当驱动外设工作时,其编程模式到底采用中断模式触发还是轮训模式触发往往是驱动开发人员首先需要考虑的问题,并且这个问题在实时操作系统与分时操作系统中差异非常大。 轮询模式本身采用顺序执行的方式:查询到相应的事件然后进行…

探索跑腿配送App的未来:技术和创新的前沿

跑腿配送App正经历着快速的技术演进,为提供更智能、高效和个性化的服务而不断创新。本文将探讨其中一个可能的创新方向:使用机器学习和实时数据分析来改进配送路线,提高效率,并为用户提供更好的体验。 技术背景 要实现这个创新…

Flink之Watermark源码解析

1. WaterMark源码分析 在Flink官网中介绍watermark和数据是异步处理的,通过分析源码得知这个说法不够准确或者说不够详细,这个异步处理要分为两种情况: watermark源头watermark下游 这两种情况的处理方式并不相同,在watermark的源头确实是异步处理的,但是在下游只是做的判断,这…

【Monorepo实战】pnpm+turbo+vitepress构建公共组件库文档系统

Monorepo架构可以把多个独立的系统放到一起联调,本文记录基于pnpm > workspace功能,如何构建将vitepress和组件库进行联调,并且使用turbo进行任务顺序编排。 技术栈清单: pnpm 、vitepress 、turbo 一、需求分析 1、最终目标…

Maven 自动化构建

自动化构建定义了这样一种场景: 在一个项目成功构建完成后,其相关的依赖工程即开始构建,这样可以保证其依赖项目的稳定。 比如一个团队正在开发一个项目 bus-core-api, 并且有其他两个项目 app-web-ui 和 app-desktop-ui 依赖于这个项目。 …

面试算法22:链表中环的入口节点(1)

题目 如果一个链表中包含环,那么应该如何找出环的入口节点?从链表的头节点开始顺着next指针方向进入环的第1个节点为环的入口节点。 例如,在如图4.3所示的链表中,环的入口节点是节点3。 分析 第1步:确认是否包含环…

产线运作中如何实现sop无纸化的作业?

在车间产线的运作中,及时准确地获取作业指导书是至关重要的。然而,传统的纸质作业指导书往往需要花费大量时间和精力来查找和更新。而有了SOP电子作业指导书系统,车间工人们只需要通过电子设备登录系统,就可以轻松地找到所需的作业…

导引服务机器人 通用技术条件

声明 本文是学习GB-T 42831-2023 导引服务机器人 通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 检验规则 6.1 检验项目 检验分为型式检验和出厂检验。检验项目见表2。 表 2 检验项目 序号 检验项目 技术要求 检验方法 出厂检验 型…

【C++】哈希与布隆过滤器

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…