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

【2】Redis 缓存击穿原理和解决方案

文章目录

  • 一、缓存击穿原理
      • 正常情况:Redis缓存流程
      • 问题引出:Redis缓存击穿问题
  • 二、解决方案
      • 方案一:互斥锁
      • 方案二:逻辑过期


一、缓存击穿原理

正常情况:Redis缓存流程

查询数据时,优先查询Redis:

  • 命中:直接返回查询结果
  • 未命中:查询数据库,返回数据并将数据写入到Redis中缓存起来方便下次查询

在这里插入图片描述

问题引出:Redis缓存击穿问题

给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮

在这里插入图片描述


二、解决方案

方案一:互斥锁

并发请求时:
请求1(线程1) 查询缓存中的数据,若未命中,则会获取互斥锁,然后查询数据库并写入缓存。
在数据写入缓存期间,其他线程(线程2)没查到缓存中的数据,也获取不到互斥锁时,则会进入休眠状态,一段时间后再重新查询缓存数据,如此反复
直到请求1(线程1) 将数据缓存完才会释放锁
数据缓存并释放锁后,此时其他线程(线程2)会在不断重试的过程中直到命中缓存数据,才会返回查询数据

在这里插入图片描述

  • 优点:安全性高 强一致性
  • 缺点:性能差 (因为其他线程都要休眠等待,直到命中缓存数据)

方案二:逻辑过期

不设置过期时间,采用逻辑过期时间

并发请求时:
请求1(线程1) 查询缓存数据,发现逻辑过期,则获取互斥锁,开启新线程后就直接返回过期数据。
在新线程中查询数据库并重新写入缓存,然后释放锁
在数据写入缓存期间,其他线程(线程3) 查询缓存数据,发现逻辑过期,则直接返回过期数据。
在数据写入缓存并释放锁后,**其他线程(线程4)**查询缓存数据,命中数据并未过期,则直接返回查询数据。

在这里插入图片描述

  • 优点:
    • 高可用
    • 性能高 直接返回结果,无需等待缓存重新写入(更新)
  • 缺点:不考虑数据一致性

相关文章:

  • 制作微PE U盘后电脑多出300M盘符(EFI分区)无法隐藏的解决过程
  • [VSCode] VSCode 设置 python 的编译器
  • LangGraph--Agent常见的模式1(增强型,提示链)
  • 高效开发REST API:Django REST Framework序列化器深度指南
  • macbook配置vscode连接腾讯云服务器
  • springboot测试类原理
  • 掌握这些 Python 函数,让你的代码更简洁优雅
  • 《深度剖析:SCSS中混入(Mixin)为浏览器前缀赋能》
  • Photoshop矢量蒙版全教程
  • Spark核心概念与DAG执行原理笔记
  • 中国风系列简约淡雅通用PPT模版分享
  • Spring Boot 实训项目 - 图书信息网站
  • 鸿蒙Next仓颉语言开发实战教程:设置页面
  • 【系统设计【2】】粗略估算
  • @SpringBootTest 详解
  • langChainv0.3学习笔记(中级篇)
  • 基于PPSO与BP神经网络回归模型的特征选择实战(Python实现)
  • AndroidStudio下载的SDK没有tool目录,或者想要使用uiautomatorviewer工具
  • Java网络编程深度解析
  • 实战指南:部署MinerU多模态文档解析API与Dify深度集成(实现解析PDF/JPG/PNG)
  • 知名企业门户网站建设服务公司/产品宣传推广策划
  • 电子商务网站建设与运营的试题/百度指数网
  • 温州网站建设设计/东莞搜索引擎推广
  • 广安网站建设/软文推广代理
  • php网站开发价格/seol英文啥意思
  • 永济市网站建设/html网页制作软件有哪些