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

Redis:缓存穿透、缓存雪崩和缓存击穿(未完待续)

Redis的缓存穿透、缓存雪崩和缓存击穿

  • 一. 缓存穿透
    • 1.1 概念
    • 1.2 造成的问题
    • 1.3 解决方案
    • 1.4 案例:查询商铺信息(缓存穿透的实现)
  • 二. 缓存雪崩
    • 2.1 概念
    • 2.2 解决方案
  • 三. 缓存击穿(热点key)
    • 3.1 概念
    • 3.2 解决方案
    • 3.3 案例:查询商铺信息(互斥锁和逻辑过期的实现)
      • (1)互斥锁
        • 补充:SETNX(setIfAbsent)
      • (2)逻辑过期

一. 缓存穿透

1.1 概念

缓存模型;

定义:指客户请求的数据在缓存中和数据库中都不存在!这样缓存永远不会命中,请求都会发到数据库;
(穿透即穿透了缓存和数据库);
在这里插入图片描述

1.2 造成的问题

假设不断发送这样的请求,则会让数据库崩溃;

1.3 解决方案

(1)主动

  1. 增加请求参数的复杂度且有一定规范,对请求参数提前做校验
  2. 加强用户权限校验,如用拦截器校验登录状态;
  3. 热点参数的限流

(2)被动

  1. 缓存空对象
    为了不再让请求造成缓存穿透,则产生一个null空值(value=””)到redis中,当下次再请求时就可以从Redis返回而不用去查数据库;
    优点:简单
    缺点
    ①造成Redis中的内存消耗;----- 对这样的null值数据设置TTL有效时间;
    ②短期不一致:Redis中存了null值,但是数据库此时真的增加了这条数据,而缓存中数据和数据库不一样,当有用户来查询时会查到null数据;------ 缩短TTL时间 或者手动覆盖数据到Redis中
    在这里插入图片描述
  2. 布隆过滤
    【在请求访问Redis之前】添加一个布隆过滤器;
    布隆过滤器中存储的是byte字节数据,存储的是二进制位;
    数据库中的数据会经过Hash算法,将计算后的值到布隆过滤器,当请求发过来时,会判断请求的Hash值是否存在于过滤器中,若过滤器判断不存在则一定不存在;
    若过滤器判断存在,则只是可能存在,不是100%准确,所以依然有一定缓存穿透风险的;
    优点:内存占用少,只需要存Hash值,没有多余key
    缺点:实现相对复杂;可能误判(哈希冲突);
    在这里插入图片描述

1.4 案例:查询商铺信息(缓存穿透的实现)

业务逻辑
1.注入stringRedisTemplate的bean,从Redis查询商户缓存,如果命中则判断是不是空值,不是则返回商铺信息,是则返回不存在;
2.未命中则查询数据库,若不存在,报错;
3.若数据库中存在,则用stringRedisTemplate.opsForVlaue将商铺信息更新到Redis中,并更新TTL有效时间(兜底)!
4.如果数据库中也不存在(缓存穿透),则将空值写入Redis,即value=“”;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果
发送id不存在的查询请求,查询Redis和数据库,缓存穿透了,返回“不存在”,会在Redis缓存一个空值;
假设再发送同样的请求,则查询到Redis中的空字符串数据,还是返回“不存在”,但是不走数据库了!
在这里插入图片描述

总结:1. 缓存穿透则写入空值 2. Redis命中时需要判断是否为空字符串;

二. 缓存雪崩

2.1 概念

定义:同一时段内有①大量的缓存Key同时失效过期 或者 ②Redis服务宕机,导致大量请求发往数据库,带来巨大压力;
在这里插入图片描述

2.2 解决方案

(1)针对大量缓存同时失效:

  1. 给不同的key的TTL添加随机值
  2. 给缓存业务添加降级限流策略,牺牲部分服务,保护数据库;

(2)针对Redis宕机:

  1. 启用熔断机制暂停服务;
  2. 主从节点的方式建立Redis高可用集群哨兵机制 可以实现对服务的监控(类比Kafka),主从实现数据同步;
  3. 多个层面建立缓存,让Nginx也做缓存,Nginx未命中,再去Redis,再去JVM,最后才是数据库
    多级缓存在大型电商中如商品详情会使用,以应对亿级以上的并发;

三. 缓存击穿(热点key)

3.1 概念

定义
业务通常会有几个数据会被 ①频繁访问,比如秒杀活动,且 ②缓存重建业务比较复杂,这类被频地访问的数据被称为 热点数据

如果缓存中的某个热点数据过期了且缓存重建耗时较长,此时大量的请求线程都会去缓存重建,会对数据库带来巨大冲击;
在这里插入图片描述

3.2 解决方案

(1)互斥锁
所有请求都去尝试缓存重建,所以用互斥锁的方式只让一个请求线程去缓存重建
只有获取到锁的请求线程才能去进行缓存重建;而其他请求线程则休眠一会再查询,直到锁释放后,再访问到新的缓存;

优点:保持数据的一致性
缺点:线程需要等待,性能不好(牺牲可用性)
在这里插入图片描述

(2)逻辑过期

  1. 缓存穿透的原因就是因为热点数据过期,所以设置一个 逻辑过期 让热点数据在Redis中永不过期(不设置TTL);
    新增一个过期时间的字段放到Value中,让线程可以判断是否逻辑过期;(类似MyBatisPlus的逻辑删除),但实际上不是TTL,这样每次都能命中;
  2. 线程发现热点数据已经逻辑过期,就尝试获取互斥锁
    ①如果获取锁成功,则开启一个新的线程 去缓存重建原线程返回旧数据
    ②获取失败则返回旧数据;

优点:线程不需要等待,性能好(保证可用性)
缺点:牺牲一致性
在这里插入图片描述

注意
互斥锁方法和逻辑过期都用了互斥锁,前者当其他线程发现锁被占用后则会一直重试等待直到缓存重建完成;
后者当其他线程发现数据逻辑过期后才去尝试获取锁,锁被占用则获取旧的热点数据,而不会一直等待;

总结:互斥锁和逻辑过期都是在解决缓存重建时的并发问题; 互斥锁即让请求线程等待,保证一致性;逻辑过期是可以拿到旧数据即保证了可用性,但是牺牲了一致性

3.3 案例:查询商铺信息(互斥锁和逻辑过期的实现)

(1)互斥锁

流程
1.注入stringRedisTemplate的bean,从Redis查询商户缓存,如果命中返回商铺信息,
2.如果未命中则尝试获取锁,注意锁的key不是商铺id,
3.没有拿到锁则休眠一会,再重新尝试查询Redis(递归);
4.获取到锁则缓存重建,缓存重建需要去查询数据库,查完后更新Redis,释放锁;
5.返回结果;

先建立加锁和解锁两个方法:
为了防止锁永不释放,给锁加有效期(兜底)
在这里插入图片描述
业务逻辑:
在这里插入图片描述
在这里插入图片描述

测试
使用JMeter模拟多线程并发的场景;
设置1000个线程,时间共5s,QPS=200/s;
在这里插入图片描述

结果
Idea中显示只查询了一次数据库,成功;

补充:SETNX(setIfAbsent)

SETNX / setIfAbsent:(NX=not exist)即key不存在时才能set成功! 用来作 互斥锁 使用;


在这里插入图片描述
即相当于是互斥锁,只有第一个能成功!后面的都失败了!
释放锁:
在这里插入图片描述
为了防止锁永远不被释放,一般加有效期(兜底):假设10秒,一般业务执行在1秒内;

(2)逻辑过期

相关文章:

Redis:缓存穿透、缓存雪崩和缓存击穿(未完待续)

Redis的缓存穿透、缓存雪崩和缓存击穿一. 缓存穿透1.1 概念1.2 造成的问题1.3 解决方案1.4 案例:查询商铺信息(缓存穿透的实现)二. 缓存雪崩2.1 概念2.2 解决方案三. 缓存击穿(热点key)3.1 概念3.2 解决方案3.3 案例&a…...

HIVE 基础(四)

目录 分桶(Bucket) 设定属性 定义分桶 案例 建表语句 表数据 上传到数据 创建分桶语句 加载数据 分桶抽样(Sampling) 随机抽样---整行数据 随机抽样---指定列 随机抽样---百分比 随机抽样---抽取行数 Hive视图&#…...

整型在内存中的存储(详细剖析大小端)——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容是整型在内存中的存储噢,现在,就让我们进入整型在内存中的存储的世界吧 数据类型详细介绍 整型在内存中的存储:原码、反码、补码 大小端字节序介绍及判断 数据类型介绍 前面我们已经学…...

PS_高低频和中性灰——双曲线

高低频 高低频磨皮:把皮肤分成两个图层,一层是纹理层也就是皮肤的毛孔。 一层是皮肤光滑层没有皮肤细节。 高频”图层为细节层,我们用图章工具修高频 “低频”图层为颜色层,我们用混合画笔修低频 原理:修颜色亮度光影…...

Vim 命令速查表

Vim 命令速查表 简介:Vim 命令速查表,注释化 vimrc 配置文件,经典 Vim 键盘图,实用 Vim 书籍,Markdown 格式,目录化检索,系统化学习,快速熟悉使用! Vim 官网 | Vim | Vim…...

Java重要基本概念理解

熟悉JVM反射机制。 (1)反射的定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Ja…...

逆向工具之 unidbg 执行 so

1、unidbg 入门 unidbg 是一款基于 unicorn 和 dynarmic 的逆向工具, 可以直接调用 Android 和 IOS 的 so 文件,无论是黑盒调用 so 层算法,还是白盒 trace 输出 so 层寄存器值变化都是一把利器~ 尤其是动态 trace 方面堪比 ida tr…...

zk-STARK/zk-SNARK中IP,PCP,IPCP,IOP,PIOP,LIP,LPCP模型介绍

我们的目标是构造 zkSNARK。在我们的目标场景中,Prover 只需要发送一个简短的证明字符串给 Verifier,而 Verifier 不需要给 Prover 发送任何消息。 直接构造一个满足这个场景的 zkSNARK 可能会很困难。一个更灵活的方式是在先在理想模型下构造证明系统&…...

StreamAPI

StreamAPI 最近开发用上了 Java8的StreamAPI,(咋现在才用?嗯哼,项目需要)自己也不怎么会,来总结一波吧! 别认为好抽象!!!干他就完事 一.StreamAPI介绍 就是用来处理集合的数据 其实到后面会发现和SQL的语句是差不多的~哈哈?你不信?往下面看 Stream:英文翻译叫做流 举个粟子…...

MySQl高可用集群搭建(MGR + ProxySQL + Keepalived)

前言 服务器规划(CentOS7.x) IP地址主机名部署角色192.168.x.101mysql01mysql192.168.x.102mysql02mysql192.168.x.103mysql03mysql192.168.x.104proxysql01proxysql、keepalived192.168.x.105proxysql02proxysql、keepalived 将安装包 mysql_cluster_…...

java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)

1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性。 PageObject设计…...

oracle11g忘记system密码,重置密码

OPW-00001: 无法打开口令文件 cmd.exe 使用管理员身份登录 找到xxx\product\11.2.0\dbhome_1\database\PWDorcl.ora文件,删除 执行orapwd fileD:\app\product\11.2.0\dbhome_1\database\PWDorcl.ora passwordtiger (orapwd 在\product\11.2.0\dbhome_1\BIN目录下…...

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…...

HTTP协议知识体系核心重点梳理

HTTP协议知识体系核心重点梳理TCP/IP协议1.四层模型2.通信过程3.tcp三次握手和四次挥手4.tcp安全传输4. 一次HTTP通信流程HTTP协议HTTP/1.1CookieHttp报文格式内容编码分块传输编码HTTP状态码重定向状态码常用的通用首部cache-controlExpiresConnectionTransfer-Encoding常用的…...

Nginx优化与防盗链

Nginx优化与防盗链 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! &#x1f4c…...

自动驾驶路径规划概况

文章目录前言介绍1. 路径规划在自动驾驶系统架构中的位置2. 全局路径规划的分类2.1 基础图搜索算法2.1.1 Dijkstra算法2.1.2 双向搜索算法2.1.3 Floyd算法2.2 启发式算法2.2.1 A*算法2.2.2 D*算法2.3 基于概率采样的算法2.3.1 概率路线图(PRM)2.3.2 快速…...

某某银行行面试题目汇总--HashMap为什么要扩容

一、HashMap啥时候扩容,为什么扩容? HashMap的默认大小是16。在实际开发过程中,我们需要去存储的数据量往往是大于存储容器的默认大小的。所以,出现容量默认大小不能满足需求时,就需要扩容。而这个扩容的动作是由集合自…...

求职者:“我有五年测试经验”面试官: “不,你只是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续学习的习惯,但对于…...

Nacos配置中心

什么是配置中心所谓配置中心:在微服务的环境下,将项目需要的配置信息保存在配置中心,需要读取时直接从配置中心读取,方便配置管理的微服务工具我们可以将部分yml文件的内容保存在配置中心一个微服务项目有很多子模块,这些子模块可能在不同的服务器上,如果有一些统一的修改,我们…...

【故障】6、yum不可用

文章目录[toc]一、yum命令不能使用1)报错2)问题分析3)完全删除python及yum重新安装1、删除python2、删除yum3、下载Python依赖rpm包4、下载yum依赖rpm包5、强制安装python6、强制安装yum7、测试一、yum命令不能使用 1)报错 Ther…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...