redis穿透、雪崩、击穿及其解决方案

redis穿透、雪崩、击穿及其解决方案

  • redis三个问题及解决方案
    • 缓存穿透
    • 缓存雪崩
    • 缓存击穿

redis三个问题及解决方案

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。也就是说key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

在这里插入图片描述

一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。

解决方案:

  1. **对空值缓存:**如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存。这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了 。

  2. **设置可访问的名单(白名单):**使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。

  3. 布隆过滤器:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,假设布隆过滤器判断这个数据不存在,则直接返回,这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突。

    在这里插入图片描述

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。缓存雪崩与缓存击穿的区别在于这里针对很多key缓存,前者则是某一个key。

正常访问情况:

在这里插入图片描述

缓存瞬间失效:

在这里插入图片描述

解决方案

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。换句话说,redis中的key存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

在这里插入图片描述

常见解决方案

  • 互斥锁
  • 逻辑过期

互斥锁:加锁就具有互斥性了,也就意味着数据库只能一个一个的访问,进而能避免同一时间大量的线程访问数据库,造成数据库崩溃,但这也会影响查询的性能,因为此时会让查询的性能从并行变成了串行,我们可以采用tryLock方法 + double check来解决这样的问题。

在这里插入图片描述

逻辑过期:导致此问题的主要原因源于对key设置了过期时间,但是不设置过期时间又会导致有些数据长期占用内存,此时就可以采用逻辑过期。

我们把过期时间设置在 redis的value中,注意:这个过期时间并不会直接作用于redis,而是我们后续通过逻辑去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程他会开启一个 线程去进行 以前的重构数据的逻辑,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把 重建数据构建完后,其他线程才能走返回正确的数据。

此方案的优点在于,异步的构建,但是缺点就是在构建完之前,返回的都是脏数据

两种方案的比较:

解决方案优点缺点
互斥锁线程需要等待,性能受影响、可能有死锁风险
逻辑过期线程无需等待、性能较好不保证一致性、有额外内存消耗、实现复杂

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员-瑞吉外卖Day10

1.菜品分页查询 而在我们的实体类 Dish 中,仅仅包含 categoryId, 不包含 categoryName,那么我们应该如何封装查询的数据呢? 其实,这里我们可以返回DishDto对象,在该对象中我们可以拓展一个属性 categoryN…

高精度10m/30米NPP净初级生产力分布数据

引言 第一性生产力是绿色植物呼吸后所剩下的单位面积单位时间内所固定的能量或所生产的有机物质,即是总第一性生产量减去植物呼吸作用所剩下的能量或有机物质。多种卫星遥感数据反演净初级生产力(NPP)产品是地理遥感生态网平台推出的生态环境…

java-ssm-jsp的问卷调查系统的设计与实现

java-ssm-jsp的问卷调查系统的设计与实现

使用Python查询和下载Sentinel卫星数据

欢迎学习本教程,了解如何使用 Python 访问和下载 Sentinel 卫星数据。在深入探讨技术方面之前,让我们先了解一下哨兵卫星是什么以及它们为何如此重要。 哨兵家族。资料来源:欧空局。 Sentinel 卫星是欧洲航天局 (ESA) 开发的一组地球观测任务,是哥白尼计划的一部分,该计划…

论文阅读 Stepwise Feature Fusion: Local Guides Global

1,另一个ssfomer 我在找论文时发现,把自己的分割模型命名为ssformer的有两个:,一个论文SSformer: A Lightweight Transformer for Semantic Segmentation中提出的一种轻量级Transformer模型,结构如下 这个结构很简单&…

安装配置HBase

HBase集群需要整个集群所有节点安装的HBase版本保持一致,并且拥有相同的配置,具体配置步骤如下: 1. 解压缩HBase的压缩包 2. 配置HBase的环境变量 3. 修改HBase的配置文件,HBase的配置文件存放在HBase安装目录下的conf中 4. 首…

Docker Desktop将镜像存储位置从C盘迁移到其它盘

一、简述 Docker Desktop默认安装在C盘,默认镜像存储位置在 C:\用户\Administrator\AppData\Local\Docker\wsl Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。 可以命令行执行wsl --list -v 看到 二、迁移步骤 1、在Docker Desktop…

加载spacy中文语言模型 zh_core_web_sm错误解决办法

如果你代码在运行时找不到该模型且报错 并且安装该模块也报错 那么可以试一下手动安装 Chinese spaCy Models Documentationhttps://spacy.io/models/zh#zh_core_web_sm 点击安装到C盘,就是你平时pip install的标准路径 最后进入终端 即可安装成功!

【编程语言】C#语言相关知识

前言:我们在游戏开发的过程中,往往会通过游戏引擎结合编程语言的方式,来作为项目开发的手段。因此,了解相关语言的特性、发展和前沿知识,就显得相当必要。笔者这里结合自身的工作经验和学习心得,用简洁通俗…

Jmeter入参问题小记

表单入参的时候,这个地方需要勾选,如果不☑️选的话,会提示errorMsg":"Required String parameter code is not present",

MYSQL Unknown column ‘appreciation.latitude‘ in ‘where clause‘

问题 笔者编写mysql语句,执行报错 详细问题 笔者sql代码 SELECT ap.*, su.username, wh.wheat_name FROM appreciation ap LEFT JOIN sys_user su ON su.id ap.user_id LEFT JOIN wheat wh ON wh.id ap.crop_id WHERE appreciation.latitude 1报错信息 >…

100. Go单测系列0---单元测试基础

文章目录 一、Go语言测试1. go test工具2. 单元测试函数3. 单元测试示例4. 子测试5. 表格驱动测试6. 并行测试 二、使用工具生成测试代码三、测试覆盖率四、testify/assert五、总结 本文主要讲解在Go语言中如何编写单元测试以及介绍表格驱动测试、回归测试和单元测试中常用的断…

【SpringBoot3】快速启动框架 快速入门 配置文件

文章目录 SpringBoot3介绍一、快速入门二、入门总结1. 为什么依赖不需要写版本?2. 启动器(Starter)是什么3. SpringBootApplication注解包括的效果? 三、SpringBoot3配置文件3.1 统一配置管理概述3.2 属性配置文件使用3.3 YAML配置文件使用3.4 批量配置文…

【开源】SpringBoot框架开发新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

大语言模型系列-提示工程

文章目录 前言一、Prompt Learning二、上下文学习(In-Context Learning)三、指示学习(Instruction Learning)四、思维链(Chain-of-Thought)总结 前言 前文提到自BERT以来,LLM的训练范式变为预训…

C#-WPF 入门

WPF 应用 使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn Windows Presentation Foundation (WPF) ,这是一个与分辨率无关的 UI 框架,使用基于矢量的呈现引擎,构建用于利用现代图形硬件。 WPF 提供一套完善的应用程序开发…

软考68-上午题-【面向对象技术2-UML】-事物

一、事物 UML中有4种事物: 结构事物;(模型的静态部分)行为事物;(模型的动态部分)分组事物;注释事物。 1-1、结构事物 静态图:类图、对象图、用例图 1-2、行为事物 动态…

【CSS面试题】外边距折叠的原因和解决

参考文章 什么时候出现外边距塌陷 外边距塌陷,也叫外边距折叠,在普通文档流中,在垂直方向上的2个或多个相邻的块级元素(父子或者兄弟)外边距合并成一个外边距的现象,不过只有上下外边距才会有塌陷&#x…

抖音开放平台第三方开发,实现代小程序备案申请

大家好,我是小悟 抖音小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个…

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题,以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门: 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…