Redis缓存穿透-击穿-雪崩详细分析加解决办法

news2024/12/25 2:08:58

Redis

缓存穿透

问题描述-如图

在这里插入图片描述

缓存穿透的原因

  1. key 对应的数据在数据源并不存在,每次针对此key 的请求从缓存获取不到,请求都会压到数据源, 可能压垮数据源
  2. 比如: 用一个不存在的用户id 获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库
  3. 也就是说:如果从存储层查不到数据则不会写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询, 失去了缓存的意义

缓存穿透的现象/表象

  1. 应用服务器压力变大

  2. Redis 命中率降低

  3. 一直查数据库

解决方案/思路

对空值缓存

如果一个查询返回的数据为空,我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间应该短些,最长不超过五分钟

设置可访问的名单(白名单)

定义一个可以访问的名单,每次访问和白名单的id 进行比较,如果访问id 不在白名单里面,进行拦截,不允许访问, 比如使用bitmaps 实现.

采用布隆过滤器

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难

进行实时监控

当发现Redis 的命中率开始急速降低, 需要排查访问对象和访问的数据, 和运维人员配合,可以设置黑名单限制服务

缓存击穿

问题描述-如图

在这里插入图片描述

缓存击穿的原因

  1. key 对应的数据存在,但在redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期, 会从后端DB 加载数据并回设到缓存,这时大并发的请求可能会瞬间把后端DB 压垮
  2. 比如某个热点数据, 可能会在某些时间点, 被超高并发地访问, 容易出现缓存击穿

缓存击穿的现象/表象

  1. 数据库访问压力瞬时增加
  2. Redis 里面没有出现大量key 过期
  3. Redis 正常运行状态, 但是数据库可能瘫痪了

解决方案

预先设置热门数据

在redis 高峰访问之前,把一些热门数据提前存入到redis 里面,加大这些热门数据key 的时长

实时调整

现场监控哪些数据热门,实时调整key 的过期时长

使用锁

在这里插入图片描述

  • 就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db。

  • 先使用缓存工具的某些带成功操作返回值的操作(比如Redis 的SETNX)去set 一个mutex key

  • 当操作返回成功时,再进行load db 的操作,并回设缓存,最后删除mutex key;

  • 当操作返回失败,证明有线程在load db,当前线程睡眠一段时间再重试整个get 缓存的方法

  • 使用锁效率会有影响

缓存雪崩

问题描述-如图

在这里插入图片描述

在这里插入图片描述

缓存雪崩的原因

  1. key 对应的数据存在,但在redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB 加载数据并回设到缓存
  2. 这个时候大并发的请求可能会瞬间把后端DB 压垮。
  3. 缓存雪崩与缓存击穿的区别在于这里针对很多key 缓存,前者则是某一个key

缓存雪崩的现象/表象

  1. 数据库访问压力变大, 服务器崩溃
  2. 在极短时间内, 访问大量Key, 而这些Key 集中过期

解决方案/思路

构建多级缓存架构

nginx 缓存+ redis 缓存+其他缓存(ehcache 等) , 这种方式开发/维护成本较高

使用锁或队列

用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况

设置过期标志更新缓存

记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key 的缓存。

将缓存失效时间分散开

比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件

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

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

相关文章

Spring Boot 集成 Redisson分布式锁(拿来即用版)

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面,例如分布式锁、分布式集合、分布式事件发布和订…

JSON5的作用、安装及使用

JSON5是对JSON的扩展,让人可以更容易手工编写和维护,用来减少一些JSON的限制,诸如json语法不支持注释,不支持字符串换行,所有的key都必须双引号,末尾不能有多余的逗号…等等,一大堆极其严格的要…

chatgpt赋能python:Python的退役与SEO

Python的退役与SEO 随着Python编程语言的流行和普及,越来越多的人开始使用它来开发各种类型的应用程序。但是,就像我们所知道的,所有技术都会发生变化,包括编程语言。因此,Python程式员可能会感到困惑和担忧&#xff…

JavaScript对象 (八):对象类型的使用、值类型和引用类型、函数的this指向、工厂方法创建对象、构造函数和类、new创建对象

1. 对象类型的使用 1.1 认识对象类型 基础数据类型可以存储一些简单的值,但是现实世界的事物抽象成程序时,往往比较复杂。 比如一个人,有自己的特性(比如姓名、年龄、身高),有一些行为(比如跑…

课程17:菜单管理功能实现

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

为什么运行时安全性重新流行起来?

容器通过以更高效和可扩展的方式创建、打包和部署应用程序,彻底改变了软件开发过程。 然而,能力越大,责任越大,对“左移安全性”的高度关注为那些在运行时忽视安全性的组织带来了风险。 通过对容器运行时安全采取多层次、全面的…

云服务器ECS_云主机_服务器托管_弹性计算-阿里云

阿里云服务器ECS(Elastic Compute Service)是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云服务器网分享阿里云服务器ECS详细介…

Linux文件操作四剑客

目录 一、grep (一)作用 (二)格式 (三)选项 (四)案例 1、查看/etc目录下所有包含bash的文件名:grep -rl bash /etc 2、查看/var/log目录下所有包含error的文…

读发布!设计与部署稳定的分布式系统(第2版)笔记04_集成点

1. 第一个拥有10亿用户的网站 1.1. 2016年,Facebook宣布其每日活跃用户数量为11.3亿 1.2. 对整个应用程序来说,“五个9”的可靠性远远不够,这每天会让成千上万的用户失望 1.3. 假如按照六西格玛质量标准来衡量,那么Facebook每天…

LIN-网络管理:休眠(Go To Sleep)和唤醒(Wake up)

文章目录 一、LIN总线的两种状态二、休眠模式(Go To Sleep)①利用诊断帧中的主机请求帧 0x3C 作休眠命令②当总线静默(没有显性和隐性电平之间的切换)4s~10s 时,节点自动进入休眠状态。 三、唤醒模式(Wake up&#xff…

智能图片降噪-Topaz Photo AI

今天给各位小伙伴们测试了一款可以使视频智能无损放大的软件——Topaz Photo AI。 小编在很早之前也有了解过Topaz系列的软件,都是通过人工智能处理的,对小白新手们很适用,由于使用人工智能方面的软件或程序对硬件要求都比较高,因…

交通指南系统

一、实验目的 1. 掌握图的基本存储方法; 2. 掌握有关图的操作算法并用高级语言实现; 3. 熟练掌握图的两种搜索路径的遍历方法。 二、实验内容 假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区域中的重要场所&#xff0…

设计模式(二十二):行为型之备忘录模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

【C】转义字符以及注释的介绍

转义字符 转义字符顾名思义就是转变意思。就是把原来字符的意思转变了&#xff0c;让它拥有别的意思。 如果我们想要在屏幕上打印&#xff1a;c:\code:\test.c 这样一串文字的话&#xff0c;我们代码肯定会这样写&#xff1a; #include<stdio.h> int main() {printf(&q…

压缩感知入门④基于总体最小二乘的扰动压缩感知重构算法

压缩感知系列博客&#xff1a;压缩感知入门①从零开始压缩感知压缩感知入门②信号的稀疏表示和约束等距性压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法压缩感知入门④基于总体最小二乘的扰动压缩感知重构算法 文章目录 1. Problem2. 仿真结果3. MATLAB算法4. 源码地…

Bean 的六种作用域

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 前端使用VSCode(Visual Studio Code1.78.2) 电脑使用的操作系统版本为 Windows 10 目录 前言 Bean Spring 容器在初始化⼀个 Bean 的实例时&#xff0c;同时会指定该实例的作⽤域。 1. …

chatgpt赋能python:Python怎样能通过值找到键

Python怎样能通过值找到键 Python是一种高级编程语言&#xff0c;它在工业、医疗、科学、财务等多个行业中被广泛使用&#xff0c;是数据科学、人工智能和深度学习等领域的首选语言。在Python编程中&#xff0c;有时候我们需要在字典中根据值查询对应的键&#xff0c;本文将介…

chatgpt赋能python:Python排序算法大全

Python排序算法大全 导言 排序是程序员日常工作中最常见的操作之一。Python提供了许多实现排序算法的库和函数&#xff0c;本文将带您了解这些排序方法。 初级排序算法 冒泡排序 Bubble Sort 冒泡排序是一种简单的排序算法。它通过不断交换相邻的元素&#xff0c;将大的元…

【微服务架构设计和实现】4.2 服务边界的定义和划分

第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【基于容器的部署、管理和扩展】 第四章&#xff1a;【4.1 微服务架构概述和设计原则】 4.2 服务边界的定义和划分 4.2 服务边界的定义和划分4.2.1 什么是服务边…

docker创建Ubuntu,Ubuntu创建桌面环境,本机使用VNC连接

题目&#xff1a;docker创建Ubuntu&#xff0c;Ubuntu创建桌面环境&#xff0c;本机使用VNC连接 文章目录 前言docker创建基于Ubuntu:20.04的容器使用ssh连接容器容器安装桌面环境本机电脑使用VNC连接测试用python来创建的ui能否显示坑参考 前言 为什么我想要用ubuntu的桌面环…