当前位置: 首页 > news >正文

Redis - 缓存访问 缓存穿透 缓存击穿 缓存雪崩

一、缓存访问

1、客户端发送请求

2、服务首先会请求 redis,查看请求的内容是否存在

3、redis 将请求结果返回给服务,如果返回的结果有数据则直接返回给客户端;如果没有数据则会继续往下执行

4、服务从数据库中查询请求的数据

5、数据库将查询的结果返回给服务

6、如果数据库有返回数据,则将返回的结果添加到 redis

7、将请求到的数据返回给客户端

二、缓存穿透

通过接口访问一个缓存和数据库都不存在的数据。

因为服务出于容错考虑,当请求从持久层查不到数据则不写入缓存,这将导致请求这个不存在的数据每次都要到持久层去查询,失去了缓存的意义。

此时,缓存起不到保护后端持久层的意义,就像被穿透了一样。导致数据库存在被打挂的风险。

解决办法

1、接口请求参数的校验。对请求的接口进行鉴权,数据合法性的校验等;比如查询的 userId 不能是负值或者包含非法字符等。

2、当数据库返回空值时,将空值缓存到 redis,并设置合理的过期时间。

3、布隆过滤器。使用布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库。(布隆过滤器存在一定误判情况:当判断不存在时一定不存在,当判断存在时极小可能不存在)

三、缓存击穿

某个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,导致数据库存在被打挂的风险。

解决办法

1、加互斥锁。当热点 key 过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入 redis 后释放锁。后续的请求直接走缓存。

2、设置缓存不过期或者后台有线程一直给热点数据续期。

四、缓存雪崩

大量的热点数据过期时间相同,导致数据在同一时刻集体失效。造成瞬时数据库请求量大、压力骤增,引起雪崩,导致数据库存在被打挂的风险。

解决办法

1、将热点数据的过期时间打散。给热点数据设置过期时间时加个随机值。

2、加互斥锁。当热点 key 过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入 redis 后释放锁。后续的请求直接走缓存。

3、设置缓存不过期或者后台有线程一直给热点数据续期。

http://www.lryc.cn/news/323095.html

相关文章:

  • SAP Business Application Studio(BAS)中开发Fiori App的基础知识
  • DashScope - 阿里模型服务灵积
  • 个人信息-求职[web前端]
  • Apache DolphinScheduler 社区开启讲师招募,赶快加入吧!
  • 【HTML面试题】src和href的区别
  • 电脑文件msvcp100.dll丢失原因,如何快速修复msvcp100.dll
  • 安装OneNote for Win10 | Win10/Win11
  • 力扣242. 有效的字母异位词
  • windows server 下的mysql 8.0.28修改数据库目录
  • 【Excel自动化办公】使用openpyxl对Excel进行读写操作
  • 大龄女程序员脱单指南:如何科学评估你的Mr. Right?(含C语言代码示例)
  • 深入剖析Java并发库(JUC)之StampedLock的应用与原理
  • 【PMP】每日一练2
  • 2024年投影仪显示技术怎么选?哪个好?优缺点详解,买前必看
  • Git Bash命令初始化本地仓库,提交到远程仓库
  • Docker 学习笔记一
  • Git一点通
  • 商标转让有哪些好处 商标转让条件 商标转让流程
  • 诺视科技完成亿元Pre-A2轮融资,加速Micro-LED微显示芯片商业化落地
  • Unity定时播放音乐
  • 如何做接口测试?
  • U盘打不开提示格式化怎么办,U盘提示格式化数据恢复
  • LeetCode - 存在重复元素
  • RUST egui体验
  • 详解llamaindex
  • 管理类联考–复试–英文面试–问题--规划介绍原因做法--汇总
  • 成都百洲文化传媒有限公司电商新浪潮的领航者
  • 【Unity】获取游戏对象或组件的常用方法
  • html5cssjs代码 024 响应式布局示例
  • json详解