Redis缓存问题

news2024/11/25 23:38:47

目录

1、缓存穿透

2、缓存击穿

3、缓存雪崩

​​​​​​​4、Redis的并发竞争key问题


​​​​​​​1、缓存穿透

        大量请求缓存中和数据库不存在的数据。

        大量用户请求缓存中和数据库中不存在的数据,导致所有请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案:

  • 布隆过滤器(增加一个原理图)

        

        布隆过滤器的底层是一个位数组,数组的每个元素只能是0和1。

        添加数据时,将数据通过多个hash算法,映射到位数组中的不同位置,并将该位置为1。

        查询数据时,通过多个hash算法,找出查询数据在位数组中占据的位置,若所占位置全部为1,则说明该数据存在。

        优点:不存储完整的数据,所以占用内存小,查询速度快;

        缺点:hash算法映射的地址可能会重复,只能判断数据一定不存在,无法判断数据一定存在,有一定的误判率。且只支持新增和查询,不支持删除操作。

  • 缓存空对象

        当持久层不命中时,即使返回的空对象也存储在缓存中,并设置一个过期时间,之后再访问这个空数据就不用再去请求数据库。(防止用户反复用同一个id进行暴力攻击)

        会存储很多无用的空键,占用缓存空间。

​​​​​​​2、缓存击穿

        大量请求缓存中同一个失效的热点key数据。

        大量用户并发对缓存中的同一个热点key进行请求,当该热点key失效的时候,持续的大并发请求就击穿缓存,直接请求数据库,导致数据库短时间承受大量请求而崩溃。

解决方案:

  • 设置热点key永不过期
  • 互斥锁

        多个线程同时请求同一个数据时,为第一个请求数据库的线程操作加锁,其他请求等待;等到第一个请求完成后,刷新缓存,其他请求就可以直接通过缓存获取数据。

​​​​​​​3、缓存雪崩

        大量请求缓存中大面积失效的缓存数据。

        缓存同一时间大面积失效(缓存过期,缓存服务宕机),大量用户并发访问缓存时,会将请求落到数据库上,导致数据库短时间承受大量请求而崩溃。

解决方案:

  • 缓存数据设置随机的过期时间,防止同一时间大量数据集合失效
  • 集群,将数据分布在不同的缓存数据库中
  • 限流,通过加锁或队列来控制读数据库写缓存的线程数量

​​​​​​​4、Redis的并发竞争key问题

        多个Redis的客户端同时set key引起的并发问题。

        比如客户端1和客户端2需要对Redis中key为price的值+10,并发执行顺序如下:

  1. 客户端1读取price1 = 0;
  2. 客户端2读取price2 = 0;
  3. 客户端1写入price = price1+10 = 10;
  4. 客户端2写入price = price2+10 = 10。
  5. 最终Redis结果为10,而不是预期的20。

解决方案:

  • 分布式锁

        在redis的服务端用一个状态值表示锁,对锁的占用和释放通过状态值来标识

  • 消息队列

         把redis.set操作放在队列中,串行化处理。

  • 乐观锁

        假设不会冲突,使用redis命令watch进行构造。

        watch:监控一个或多个键,一旦其中有一个键被修改/删除,之后的事务就不会执行。

        multi:标记事务块的开始。Redis会将后续的命令逐个放入队列中。

        exec:在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。

watch price
get price $price
$price = $price + 10
multi
set price $price
exec

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

部分内容截取自网络,如有侵权,联系作者删除。

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

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

相关文章

GAMES202 Real-Time Global Illumination

文章目录Lecture 7 Real-time Global Illumination (in 3D)RSM (Reflective Shadow Maps)Lecture 8 Real-time Global Illumination (screen space)LPV (Light Propagation Volumes)VXGI (Voxel Global Illumination)SSAO (Screen Space Ambient Occlusi…

零基础如何入门Web性能测试?

1、目前正在研究jmeter,请问初期做性能,应先从几点做起? Jmeter和LR都是目前性能测试的首选工具,如果你有LR的学习背景,那么Jmeter上手会很快,重点理解线程和进程的概念,流程和LR是类似的。如果…

ISO27001信息安全管理体系具体要求 学习笔记

ISO27001制定背景 ISO27000 从诞生到现在只不过 20 年间的事情,但基本上可以看出一个标准 “源于生活,高于生活”的发展特点,也就是说,一个真正普遍适用并能被普遍接受的标准,必然是能体现相关领域最佳惯例并能为最佳…

这篇文章告诉你视频转音频软件哪个好用,有需自取

大家看过线下的演唱会或livehouse吗?有些歌手会在现场准备一些小彩蛋,例如演唱还未发行的歌,或是歌曲的其它版本,这时候许多歌迷都会纷纷录制下来,以便后续的欣赏观看。 但是每次想听的时候,都得反复的打开…

工业外观设计中色彩如何有效运用

我相信业内很多设计师都在考虑如何在工业产品外观设计中有目的地运用色彩。最近看了一篇关于如何在工业产品中使用色彩的论文,简单地说了一下自己的想法。 一、加工技术应考虑产品外观设计 工业设计师不仅要考虑材料,还要考虑其表面处理及其颜色。因此&a…

抖音变现模式?80%的人都不知道的秘密,三类更适合玩私域的产品

这篇内容关于适合玩私域的三类产品,精简一下让大家可以3分钟看完。不玩悬念,直接上千货。 上一篇在我赢助手小禾呈序上给大家讲了三个变现的建议,以及两种我比较推荐的变现方式。带货和支付费。今天再讲一个主流的变现思路,最后还…

Android Material Design之MaterialButtonToggleGroup(九)

效果图 资源引入 implementation androidx.appcompat:appcompat:1.3.0 implementation com.google.android.material:material:1.4.0属性 属性描述android:id控件Idandroid:layout_width控件长度android:layout_height控件高度app:checkedButton默认选中得按钮idapp:selectio…

物联网毕业设计 单片机家庭气象站设计与实现

文章目录1 简介2 主要器件引脚连接3 实现效果4 部分实现代码1 简介 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来越高&#x…

揭秘你代理商做不起来货卖不出去的原因,探讨其背后的商业逻辑

现在很多代理商,大都是可以归于“个体户”性质。这些也代表了微小型企业,从前期的蓬勃发展,到现在的经营受限,特别是疫情等影响,很多人的经营都处于举步维艰的状态,如果你们现在是代理商,仓库里…

v-charts,点击页面按钮,不能二次重绘,解决方案

v-charts简介: 是基于 Vue2.0 和 Echarts 封装的图标组件,只需要统一提供一种对前后端都友好的数据格式设置简单的配置项,就可以生成常见的图表。 v-charts官方文档:v-charts echarts官方文档:Documentation - Apach…

8个关于 Promise.then 和 Promise.catch 的面试题,一定要掌握

前面,我们要讨论了 Promise 在异步编程中的执行,错过的朋友可以直接点击《10 个 JavaScript Promise 的面试题》这篇文章进行查看。 在今天的文章中,我们将讨论这些核心 API 用于 Promise 对象的用法。 这里我提供了10个代码片段&#xff0…

SequoiaDB湖仓一体分布式数据库2022.11月刊

本月看点速览 产品能力再获认可,入围多个榜单、报告 ‍精彩亮相2022沙丘大会湖仓一体专场 实力吸睛,获多家权威媒体关注与报道 生态圈不断扩大,与6家合作伙伴完成互认证 青杉计划2023进行中,一起攀登更高的“杉” 产品能力再获…

WPF 3D 摄像机LookDirection属性研究

像前文一样画一个三角形; 摄像机的位置是(-2,2,2); 坐标系是这样的,x、y轴是在屏幕上,X轴正向向右,Y轴正向向上;Z轴是垂直于屏幕,从屏幕出来往人的方向为正向,往屏幕里边去是-Z&…

01-06-Hbase基础定义

Hbase定义: Hbase是一种分布式,可扩展,支持海量数据存储的NoSQL数据库。HBase是一个分布式的、面向列的开源数据库。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。…

[附源码]Python计算机毕业设计SSM垃圾分类网站的设计与实现(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

得一微冲刺科创板上市:拟募资约12亿元,2021年营收同比增长260%

撰稿|汤汤 来源|贝多财经 近日,得一微电子股份有限公司(下称“得一微”)在上海证券交易所科创板递交招股书(申报稿)。本次冲刺科创板上市,得一微拟公开发行不超过2354万股股份,计划募资12.24亿…

两直线垂直,斜率乘积为-1的证明

老早以前在学习初等函数的时候,线性函数中的两直线y m0x b0, y m1x b1如果垂直,则有结论两条直线的斜率乘积为-1即m0*m1 -1,以前也只是拿来用,没有证明过。最近在学图形学的时候,突然想起了这个点,因此…

[附源码]计算机毕业设计springboot社区人员信息管理系统设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

UE5笔记【十一】蓝图变量BluePrint Variables

类似于在材料中将配置参数化,我们这里也可以将配置变量化。最后实现在对象detail细节中设置修改。 在左侧组件中找到【变量】,然后点击那个加号,添加两个变量用来控制楼梯和盒体的升降速度。 分别命名为:BoxSpeed和StairSpeed。然…

Java链接redis集群

1.导入依赖 <dependencies><!-- 1、 Jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><!-- 2、 Junit测试--><depen…