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

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

文章目录

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


一、缓存击穿原理

正常情况:Redis缓存流程

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

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

在这里插入图片描述

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

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

在这里插入图片描述


二、解决方案

方案一:互斥锁

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

在这里插入图片描述

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

方案二:逻辑过期

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

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

在这里插入图片描述

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

相关文章:

  • 小米MiMo系列:MiMo-7B-RL技术报告解读
  • 05-mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server发布到PyPI官网
  • Python中shutil.rmtree()的目录删除能力详解
  • kicad运行时出错,_Pnext->_Myproxy = nullptr;访问内存出错
  • Spring Boot Web开发
  • 《拖延心理学》:深度剖析与应对指南​
  • 深入解析解释器模式:语言解析的优雅实现
  • Leetcode 刷题记录 16 —— 栈
  • 【git】 `git rm --cached *.pt` 删除了缓存,但这些大文件的历史记录仍然存在于Git历史
  • 《棒球百科》棒球怎么玩·棒球9号位
  • 岐黄慧问六月最终项目完成情况
  • 用于汽车毫米波雷达的四维高分辨率点云图像
  • 微软Bing正式推出AI视频生成工具:Bing Video Creator,由Sora技术驱动,限时免费体验!
  • 机器学习实验报告5-K-means 算法
  • ansible变量
  • 如何修改PyCharm的界面颜色(超详细)
  • vue2和vue3的底层逻辑原理、区别、用法以及应用优缺点
  • 大模型训练与推理显卡全指南:从硬件选型到性能优化
  • 软考 系统架构设计师系列知识点之杂项集萃(90)
  • AOP +ThreadLocal实现对接口监控
  • linux设置信号量系统参数
  • 【Dify系列】【Dify 核心功能】【应用类型】【三】【Agent】
  • Python 面向对象编程基础-类的创建与__init__实例化
  • [Java 基础]正则表达式
  • 第10章:Neo4j与其他技术集成
  • 图数据库neo4j部分用法浅讲
  • 基于SpringBoot和Leaflet的电影票房时序展示-以《哪吒2》为例
  • 6,TCP客户端
  • 【系统设计【3】】系统设计面试框架:从理论到实践的完整指南
  • 2013-2023年 地级市-财政透明度数据-社科经管实证数据