Redis缓存的高并发问题

news2024/11/26 16:35:57

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

1 缓存穿透

当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透” 缓存“直抵”数据库。这种情况就称为缓存穿透。一个两个请求无所谓,当高并发的访问请求到达时,缓存穿透不 仅增加了响应时间,而且还会引发对 DBMS 的高并发查询,这种高并发查询很可能会导致DBMS 的崩溃。

缓存穿透产生的主要原因有两个:一是在数据库中没有相应的查询结果,二是查询结果为空时,不对查询结果进行缓存。所以,针对以上两点,解决方案也有两个:

 对非法请求进行限制 。

 对结果为空的查询给出默认值 。

可以使用布隆过滤器解决缓存穿透的问题

  • 把已存在数据的key存在布隆过滤器中,相当于redis前面挡着一个布隆过滤器。
  • 当有新的请求时,先到布隆过滤器中查询是否存在:
  • 如果布隆过滤器中不存在该条数据则直接返回;
  • 如果布隆过滤器中已存在,才去查询缓存redis,如果redis里没查询到则再查询Mysq|数据库

2 缓存击穿

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

在这里插入图片描述

3 缓存雪崩

对于缓存中的数据,很多都是有过期时间的。

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

解决办法

事前:尽量保证整个 Redis 集群的高可用性,发现机器宕机尽快补上,选择合适的内存淘汰策略。
事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL崩掉, 通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
事后:利用 Redis 持久化机制保存的数据尽快恢复缓存

4 数据库缓存双写不一致

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

1修改 DB 更新缓存场景

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

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

第一种没有问题。

第二种:a修改DB中的数据后stock=7,刚想从本地缓存写入redis缓存,此时出问题了(有可能是时间片到了也有可能redis出现问题),这是b过来了,也修改了数据stock=2,然后更新缓存也是2,然后出现问题的a请求又好了,更新redis stock为7。(覆盖了2)

解决方案:

最经典的缓存+数据库读写的模式,就是 预留缓存模式Cache Aside Pattern。

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先删除缓存,然后再更新数据库,这样读的时候就会发现缓存中没有数据而直接去数据库中拿数据了。

题外话:

本地缓存Redis缓存是两种不同的缓存方式。

本地缓存是指将数据缓存在本地内存中,通常使用内存缓存库(如Memcached、Ehcache等)来实现。本地缓存的优点是访问速度快,缓存的数据可以快速地被读取,同时数据在本地内存中,可以减轻数据库的压力。然而,本地缓存的缺点是容易受到服务器重启、应用重启等因素的影响,同时可用空间有限。

Redis缓存是一种基于内存的(也可以持久化到磁盘)键值对存储系统,具有高性能、高可用性和可扩展性等优点。Redis可以作为分布式缓存来使用,可以减轻数据库的压力并提高应用程序的响应速度。Redis还提供了多种数据结构,如字符串、哈希、列表、集合和有序集合等,还可以设置过期时间,可以满足复杂的应用场景。

相比之下,本地缓存通常只适用于单机环境,适用于只有一个应用程序使用的数据,而Redis适用于分布式、多应用程序场景下的数据缓存。虽然Redis的性能和可用性优于本地缓存,但是使用Redis也需要考虑到数据一致性、网络延迟等问题。因此,具体的缓存方案应该根据应用场景来选择。

2修改 DB 删除缓存场景

在很多系统中是没有缓存 warmup 功能的,为了保持缓存与数据库数据的一致性,一般 都是在对数据库执行了写操作后,就会删除相应缓存。

在高并发读写请求场景下,若这些请求对 DBMS 中同一个数据的操作既包含写也包含读, 且修改后还要删除缓存中相关数据,那么就有可能会出现缓存与数据库中数据不一致的情况。

问题:

  • b先查询 redis中无数据 ,到DB查为10,然后写入本地缓存,此时出现问题中断了。
  • 然后a过来修改DB中的数据,并将redis中相关数据删除。
  • 然后b恢复执行,将本地缓存的10写入redis。
    在这里插入图片描述

3) 解决方案:延迟双删

延迟双删方案是专门针对于“修改 DB 删除缓存”场景的解决方案。但该方案并不能彻 底解决数据不一致的状况,其只可能降低发生数据不一致的概率。

延迟双删方案是指,在写操作完毕后会立即执行一次缓存的删除操作,然后再停上一段 时间(一般为几秒)后再进行一次删除。而两次删除中间的间隔时长,要大于一次缓存写操作的时长。

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

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

相关文章

SSL证书系列--又拍云Let’s Encrypt免费DV SSL证书使用教程

原文网址:SSL证书系列--又拍云Let’s Encrypt免费DV SSL证书使用教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何使用又拍云部署Let’s Encrypt免费DV SSL证书。 一、了解Let’s Encrypt 了解和关注SSL证书的朋友,似乎没有理由不知道 Let’s Encr…

java八股文面试[数据库]——数据库锁的种类

数据库锁的种类 MySQL数据库由于其自身架构的特点,存在多种数据存储引擎, MySQL中不同的存储引擎支持不同的锁机制。 MyISAM和MEMORY存储引擎采用的表级锁, InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁。 BDB采用的是页…

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理 刚刚安装好开店星网站后台之后都会出现这个code 500[undefined]的错误,需要改一下代码。改好了之后就可以正常使用了。如果大家不懂得这样处理的可以私聊我,帮忙处理…

kettle通过java步骤获取汉字首拼

kettle通过java步骤获取汉字首拼 用途描述 一组数据,需要获取汉字首拼后,输出; 实现效果 添加jar包 pinyin4j-2.5.0.jar 自定义常量数据 Java代码 完整代码: import net.sourceforge.pinyin4j.PinyinHelper; import net.sou…

高潮迭起:探寻Twitch上精彩纷呈的电子竞技赛事直播

Twitch是电子竞技赛事的热门直播平台之一,它为全球范围内的电子竞技比赛提供了广泛的覆盖和直播服务。以下是一些在Twitch上直播的电子竞技比赛和赛事的例子: League of Legends (英雄联盟) Twitch广泛直播英雄联盟的各个赛事,包括全球性的锦标赛如英雄联盟全球总决赛(World …

SLAM从入门到精通(基本框架)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 SLAM是机器人的一个分支。广义上来说,机器人还包括了计算机视觉、语音识别、自然语言处理、机械臂控制、运动控制、机器人导航、机器人…

软件架构师 设计和编码

软件架构师 设计和编码 目录概述需求: 设计思路实现思路分析1.设在设计软件架构时,您需要考虑以下方面:2.在编码方面,您需要具有以下技能: 参考资料和推荐阅读 Survive by day and develop by night. talk for import …

如何绘制英语思维导图?偷偷告诉你这个绘制方法

如何绘制英语思维导图?绘制英语思维导图可以帮助我们更好地理清思路,提高学习和工作效率。同时,英语思维导图还可以帮助我们提高英语表达能力和阅读理解能力,让我们更好地掌握英语学习和应用。因此,绘制英语思维导图是…

msvcr120.dll放在哪里?怎么修复msvcr120.dll文件

当您在运行某些应用程序或游戏时遇到“msvcr120.dll缺失”错误时,这可能会影响您的使用体验。msvcr120.dll是Microsoft Visual C Redistributable的一部分,并且它提供了程序运行所需的运行时支持,今天我们来讨论一下msvcr120.dl文件缺失了要怎…

[SSM]MyBatisPlus高级

四、高级篇 4.1主键策略 主键的作用就是唯一标识,我们可以通过这个唯一标识来定位到这条数据。对于表数据中的主键,我们可以自己设计生成规则,生成主键。但是在更多的场景中,没有特殊要求的话,我们每次自己手动生成的…

第 2 章 线性表(线性表的动态分配顺序存储结构实现)

1. 背景说明 线性表(linear Iist)是最常用且最简单的一种数据结构。简言之,一个线性表是 n 个数据元素的有限序列。 至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个符号,也可以是一页书,甚…

千粉福利——— ubuntu安装

(一)配置虚拟机,首先打开虚拟机 点击创建新的虚拟机或者左上角文件->新建虚拟机,或者使用快捷键CtrlN,选择自定义安装 选择虚拟机就硬件兼容性,默认点击下一步就好 安装客户机操作系统:选择稍后安装操作…

tensorflow QAT

tensorflow qat https://www.wpgdadatong.com/tw/blog/detail/70672 在边缘运算的重点技术之中,除了简化复杂的模块构架,来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架(TensorFlow、Pytorc…

Day7:浅谈useEffect

「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 Day7-今日话题 useEffect 是 React 中一个非常重要的 Hook,用于处理副作用和订阅外部数据源的变化。它可以在函数式组件中执行各种操作,例如数据获…

小程序如何上传微信聊天记录的文件

wx.chooseMessageFile({count: 10,type: image,success (res) {// tempFilePath可以作为img标签的src属性显示图片const tempFilePaths res.tempFiles} })参数说明 回调函数说明

数据库实现学生管理系统

1.QT将数据库分为三个层次: 1> 数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin 2> sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError 3> 用户接口层:提供一些模型QSql…

开眼“观天”,从墨迹天气服贸会之旅看气象服务新未来

今年夏天,天气焦人。先是高温早早上线,然后台风来势汹汹,北京高温、河北暴雨,杜苏芮、苏拉、海葵轮番“奔袭”,极端气象事件频繁登上热搜,其险象环生的过程,让大众对气候问题的关注度节节走高。…

架构师 软件测试

架构师 软件测试 目录概述需求: 设计思路实现思路分析1.软件测试方法 软件测试工具 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for c…

cudnn-windows-x86_64-8.6.0.163_cuda11-archive 下载

网址不太好访问的话,请从下面我提供的分享下载 Download cuDNN v8.6.0 (October 3rd, 2022), for CUDA 11.x 此资源适配 cuda11.x 将bin和include文件夹里的文件,分别复制到C盘安装CUDA目录的对应文件夹里 安装cuda时自动设置了 CUDA_PATH_V11_8 及path C:\Progra…

1123. 最深叶节点的最近公共祖先

文章目录 Tag题目来源题目解读解题思路方法一:递归 写在最后 Tag 【递归】【最近公共祖先】【二叉树】 题目来源 1123. 最深叶节点的最近公共祖先,865. 具有所有最深节点的最小子树 此二题系重复的题目。 题目解读 题目意思很明确,找出二叉…