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

Redis【缓存雪崩,缓存穿透,缓存击穿】详解

用户请求的缓存正常流程图

 上图是一个正常的简单的缓存流程!!!

土豆用户去访问某宝,某宝请求redis看看缓存中有没有土豆用户请求的数据,

如果redis中有该数据的缓存,则直接返回数据展示出来供应用户的需求,

如果redis中没有该用户请求的数据,redis就会做一件事,去数据库中进行查找,数据库中查到值了之后做两件事情,第一件事:把数据返回到redis缓存中。第二件事:把查询到的数据返回到某宝中供用户的需求

缓存雪崩:

 举个例子:用户在双十二的时候,想去某宝抢购商品,用户点进去进入首页展示出了各种各样的商品,这些商品大部分都是缓存在redis中,对应了着很多key,加入这些key的缓存时间是三个小时或者四个小时,当缓存时间已过,缓存失效,导致大量的用户把请求打到了数据库中,数据库承载不了,导致数据库挂掉,就像大大的雪山峰突然崩塌了。

列举四种解决方法:

第一种:设置这个缓存的失效时间,让它不要在同一时间失效,设置缓存时间时随机初始化缓存的时间,这样就避免了同一时间失效

第二种:搭建redis集群,把热点的key分布在不同的redis集群上面

第三种:不设置缓存失效的时间

第四种:设置一个定时的任务,定时刷这个缓存的时间

缓存穿透:

 

举个例子:比如说土豆开发了一个网站,异常的火爆男女老少该来的也来了不该来的也来了,同行一看眼红了,这不行要安排土豆,然后同行就想起来了,redis缓存中的key都是没有负数,如果用负数请求redis缓存中没有就可以直接将请求发送到数据库中,同行就利用这一个特点故意请求缓存中不存在的数据,写了几个循环大量发送key为-1或者负数,等等,导致redis缓存中没有该数据,把redis穿透了请求到了数据库,数据库一时间接收到了大量请求,又导致数据库崩了。

解决方案:

第一种就是:请求的数据穿透到数据库,无论数据库里面有没有值都把参数信息缓存到redis中,下一次再请求可以让redis缓存拦截处理一下。但是下一次可能同行就用另外一个参数来访问,只能说治标不治本

第二种就是:把恶意请求的用户ip拉黑了,但可能会换另外一个ip,同样治标不治本

第三种就是:可以对象请求参数的合法性进行校验,如果不合法直接return掉

第四种就是:用到一种布隆过滤器

缓存击穿:

再举个例子:过双十一,老马把珍藏多年的老北京布鞋拿出来拍卖,大家伙一看是老马穿过的老北京想缅怀一下老马的成功之路,程序员按照老马的指示也是安排上架了,好家伙老北京布鞋一下子被拍卖了四个小时,老北京布鞋的数据在redis缓存中时长是四个半小时,又拍卖了一会,redis缓存中老北京失效了,用户的大量请求一瞬间又达到了数据库中,数据库又承载不了挂掉了,老马不高兴了,也是很成功的把程序员送到了非洲给自己挖煤了

解决方案:

1,那就是缓存时间不过期,那肯定不太好

2,采用互斥锁,在请求到数据库这一步中上个锁,大量请求进来只有一个线程抢到了锁,进入数据库查到数据并返回给redis中,其他没有抢到的就线程就休眠几秒,过了几秒之后让其他线程去redis中查找数据,这样就降低了了数据库请求量大的问题!!

相关文章:

  • 【2022 年】 Python3 爬虫教程 - 爬虫是什么?
  • 长安链源码学习 vm-docker-go
  • 网课题库接口API—小白专用版本
  • STM32单片机的 Hard-Fault 硬件错误问题追踪与分析
  • 【精品】SpringBoot中整合Redis的简单封装及应用
  • C++ STL --- list的使用
  • 聚焦金融行业未来,博睿数据亮相第五届中国银行CIO峰会
  • 57.【Java 接口】
  • 【SCI期刊调研】
  • 【Dart 入门教程】(一) Dart 简介与安装
  • 十堰小程序开发,免费试用60天
  • 20220923_数据库过程_直销员计算语句
  • Mybatis知识总结一
  • 基于springboot校园疫情防控系统
  • mysql基于WebStorm服装购物网站的设计与实现毕业设计源码281444
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【Amaple教程】5. 插件
  • 78. Subsets
  • HTTP中的ETag在移动客户端的应用
  • Java知识点总结(JavaIO-打印流)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Laravel Telescope:优雅的应用调试工具
  • Vim Clutch | 面向脚踏板编程……
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 关于 Cirru Editor 存储格式
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #《AI中文版》V3 第 1 章 概述
  • #define
  • #LLM入门|Prompt#3.3_存储_Memory
  • $refs 、$nextTic、动态组件、name的使用
  • (2)Java 简介
  • (c语言)strcpy函数用法
  • (C语言)字符分类函数
  • (二十三)Flask之高频面试点
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四) Graphivz 颜色选择
  • (一)kafka实战——kafka源码编译启动
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (译)2019年前端性能优化清单 — 下篇
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET : 在VS2008中计算代码度量值
  • .net 流——流的类型体系简单介绍
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [1204 寻找子串位置] 解题报告
  • [Android]创建TabBar
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [C#]C#学习笔记-CIL和动态程序集
  • [cocos2d-x]关于CC_CALLBACK
  • [GXYCTF2019]BabyUpload1 -- 题目分析与详解