【Redis】Redis缓存雪崩、缓存穿透、缓存击穿(热key问题)

news2024/11/20 3:26:30

目录

一、缓存穿透

1、概念

2、解决办法

1.缓存空对象

2.布隆过滤

二、缓存雪崩

1、概念

2、解决办法

1.给key设置随机的过期时间TTL

2.业务添加多级缓存

3.利用集群提供服务可用性

4.缓存业务添加降级限流

三、缓存击穿

1、概念

2、解决办法

1.互斥锁

2.逻辑过期


一、缓存穿透

1、概念

当客户端带参数来请求某一数据的信息时,会先去在缓存里面找,如果缓存没有就去数据库中查找并写入缓存返回,如果这个请求所带的参数是非法参数,当它查询缓存时,缓存中没有该数据,此时就会查询数据库而数据库中也没有该数据,没办法构建缓存数据

2、解决办法

1.缓存空对象

当请求穿过缓存请求数据库时,由于数据库中没有数据,所以此时我们将null进行返回并缓存,下次请求时从缓存中直接获取到null。这种方式实现简单,但是内存占用会比较大,它也存短暂的数据不一致问题

2.布隆过滤

在请求到达缓存之前,先会经过布隆过滤器对请求校验,如果合法就放行如果非法就拒绝,这种方式内存占用少,但是实现复杂也存在误判的可能

二、缓存雪崩

1、概念

当某一时刻缓存中大量的key同时失效或者redis宕机,导致请求大量的打到数据库上导致数据库压力剧增

2、解决办法

1.给key设置随机的过期时间TTL

产生缓存雪崩的其中一个原因是大量key同时过期,我们可以通过设置不同的过期时间来防止缓存雪崩,而设置不同的过期时间可以设置随机的过期时间

2.业务添加多级缓存

在多个层面去建立缓存

3.利用集群提供服务可用性

提供系统可用性,可以搭建redis集群,当集群中一个服务宕机时,不会影响整体缓存的使用

4.缓存业务添加降级限流

当redis出现异常时,可以通过降级限流来保护数据库的安全性

三、缓存击穿

1、概念

一个被高并发访问且重建缓存业务复杂的key忽然失效,无数的请求在瞬间给数据库带来巨大冲击

2、解决办法

1.互斥锁

由于这个热key失效,所以当请求来时就需要去数据库查询并重建缓存,但是由于这个key是一个被高并发访问的key,所以同一时间访问完数据库去重建该key的线程可能较多,导致多个线程重复重建以及响应变慢,此时我们可以对缓存重建加锁,当线程1去重建的时候线程2不在去重复重建,但是其他没有获取到锁的线程需要等待,性能受到影响

2.逻辑过期

我们在存入这个热key在存入的时候给他加一个逻辑过期的时间字段,该字段记录过期时间,每次获取的时候查看该key是否逻辑过期,如果过期此时需要重建该缓存,此时就可以开启一个线程异步的去重建,然后返回逻辑过期的数据,当重建缓存的异步线程没有执行完时,此时另一个线程来访问,发现过期尝试重建时,没有拿到锁,于是它将逻辑过期的旧数据返回。它线程无需要等待,性能好。但是不能保证一致性,有额外的内存消耗且实现复杂

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构:第三章 栈、队列和数组

文章目录 一、栈1.1栈的概念1.1.1栈的定义1.1.2栈的基本操作1.1.3栈的常见考题1.1.4小结 1.2栈的顺序存储实现1.2.1顺序栈的定义1.2.2初始化操作1.2.3进栈操作1.2.4出栈操作1.2.5获取栈顶元素操作1.2.6共享栈1.2.7小结 1.3栈的链式存储实现1.3.1链栈的定义1.3.2小结 二、队列2.…

Optional的使用详解

工作中经常会调外部接口、或者查询表等,如果对返回结果不进行空指针判断的话就会导致空指针异常。针对这种情况经常会使用if进行判断: private boolean isNotNull(Object param) {if (param null) {return false;} else {return true;}}这样写其实功能上没有任何问…

上班摸鱼在群里吹牛B,逮到一个阿里10年老测试开发,聊过之后收益良多...

老话说的好,这人呐,一单在某个领域鲜有敌手了,就会闲得蛋疼。前几天我在上班摸鱼刷群的时候认识了一位阿里测试开发大佬,在华为工作了10年,因为本人天赋比较高,平时工作也兢兢业业,现在企业内有…

USB协议分析仪

1 ULPI PHY passive sniffing mode 概念: non driving, no pull-up, no pull-down Function Control.opMode 1; // non-Driving OTG Control.DpPulldown 0; // no pull-down OTG Control.DmPulldown 0; // no pull-down USB IO.ChargerPullupEnDP 0; // no pull-up USB IO.…

九、MyBatis动态SQL

文章目录 九、动态SQL9.1 if9.2 where9.3 trim9.4 choose、when、otherwise9.5 foreach9.6 SQL片段 本人其他相关文章链接 九、动态SQL 9.1 if 总结:根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中。 User getUserByParamsWithIf(User user…

缓存击穿,穿透,雪崩

一、缓存穿透 是用户访问的数据既不在缓存当中,也不在数据库中。 如果从数据库查询不到数据,则不写入缓存。这就导致每次请求都会到数据库进行查询,缓存也失去了意义。 当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤…

AI 工具合辑盘点(四)持续更新

AI 视频生成和编辑工具 当今,视频已经成为最受欢迎的媒介之一。我们喜欢观看视频,但是制作高质量的视频需要耗费大量时间和精力。 无论你是内容创作者、专业视频编辑师,还是完全的新手,按照传统方式制作视频需要掌握各种知识、技…

【Maxwell】MySQL数据监听

背景 我们都知道随着业务的发展,监听数据库的数据变更及时性是必须的,虽然我们可以在入库之前进行处理,但是有个问题就是事务的一致性不好掌控,而且很多业务都是微服务的,那么不在一个微服务中,可能有需要跨服务去调用,那么此时直接去监听mysql的binlog来实现数据的操作…

这一篇Databinding应该可以帮助迅速上手吧

Databinding使用篇(迅速上手) 使用前需要在模块级别的build.gradle里面的android闭包里添加: dataBinding{enabled true}接着在layout文件中按下Alt 回车, 将布局转换成data binding layout即可,此时编译就会生成对…

【JAVAEE】创建线程的方式及线程的常用方法

目录 1.创建线程的四种方式 1.1继承Thread类 1.2实现Runnable接口 1.3匿名内部类 1.4lambda表达式 2.多线程的优势-增加运行速度 3.Thread类及常用方法 3.1构造方法 3.2常见属性 演示后台线程 演示线程是否存活 3.3线程中断 3.4线程等待-join() 3.5获取当前线程 …

23年5月高项备考学习笔记——信息系统管理

管理:监督系统的设计和结构 系统:提供蓝图 系统管理: 规划和组织:业务战略、组织机制、信息系统 业务战略: 总成本领先战略 差异性战略 专注化战略 设计和实施:战略转成需求,便管理&#xff1b…

5月5号软件资讯更新合集.....

Visual Studio Code 1.78 发布 VS Code 1.78 已发布,此版本一些主要亮点包括: 辅助功能改进 - 更好的屏幕阅读器支持、新的音频提示。 新的颜色主题 - “Modern” 浅色和深色主题默认设置。 配置文件模板 - Python、Java、数据科学等的内置模板。 新…

2023年6月DAMA-CDGA/CDGP数据治理认证报名请尽早啦!

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中! 考试开放地区:北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证开班时间:5月7日 DAMA认证为数据管理专业人士提供…

线上FullGC问题排查实践——手把手教你排查线上问题 | 京东云技术团队

作者:京东科技 韩国凯 一、问题发现与排查 1.1 找到问题原因 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型&#xff0c…

【马蹄集】第九周作业

第九周作业 目录 MT2125 一样的虫子MT2126 AB数对MT2127 权值计算MT2128 黑客小码哥MT2129 来给单词分类 MT2125 一样的虫子 难度:黄金    时间限制:1秒    占用内存:128M 题目描述 有 N 只虫子,每只虫子有6条腿,每…

通过Python的pytesseract库识别图片中的文字

文章目录 前言一、pytesseract1.pytesseract是什么?2.安装pytesseract3.查看pytesseract版本4.安装PIL5.查看PIL版本 二、Tesseract OCR1.Tesseract OCR是什么?2.安装Tesseract OCR3.安装 Tesseract OCR 语言包 三、使用方法1.引入库2.打开图片文件3.使用…

聊一聊 Valgrind 监视非托管内存泄露和崩溃

一:背景 1. 讲故事 只要是程序总会出现各种莫名其妙的问题,比如:非托管内存泄露,程序崩溃,在 Windows 平台上一般用微软自家的官方工具 App Verifier 就可以洞察,那问题出在 Linux 上怎么办呢&#xff1f…

块状链表实现BigString大字符串操作(golang)

前言 块状链表是介于链表和数组之间的数据结构,能够在 O ( n ) O(\sqrt{n}) O(n ​)时间内完成插入、删除、访问操作。 数据结构如图所示。假设最大容量为 n n n, 则它有一个长度为 s n s\sqrt{n} sn ​的链表。链表中每个结点是一个长度为 2 n 2 \times \sqrt{…

C#_各类应用程序

目录 前言 1. 第一个程序:Hello,World! 1.1 Console 1.2 Windows Forms 1.3 WPF(Windows Presentation Foundation) 1.4 ASP.NET Web Forms 1.5 ASP.NET MVC(Model - View - Controller) 1.6 Windows Store A…

Tuxera NTFS2023Mac专业NTFS驱动软件 解决Mac不能写入移动硬盘U盘问题 管理修复磁盘

Tuxera NTFS2023Mac专业NTFS驱动软件 解决Mac不能写入移动硬盘U盘问题 管理修复磁盘问题! NTFS For Mac2023是一款功能强大的MAC读写软件。NTFS For Mac可以帮助用户对磁盘进行日常管理,如果用户电脑的磁盘有问题,可以使用该软件进行修复,延…