【浅学Redis】缓存 以及 缓存穿透、缓存击穿、缓存雪崩

news2024/11/28 18:49:22

缓存 以及 缓存击穿、缓存穿透、缓存雪崩

  • 1. 缓存
    • 1.1 缓存的作用
    • 1.2 缓存的应用场景
    • 1.3 引入缓存后的执行流程
    • 1.4 缓存的优点
  • 2. 缓存穿透
    • 2.1 场景
    • 2.2 解决策略
      • 1. 参数校验
      • 2. 缓存空值
  • 3. 缓存击穿
    • 3.1 场景
    • 3.2 解决策略
  • 4. 缓存雪崩
    • 4.1 场景
    • 4.2 解决策略
  • 5. 上面三者的区别

1. 缓存

1.1 缓存的作用

缓存就是一块内存,它用于存储高速交换的数据,它的使用能够提高数据交换的效率。

1.2 缓存的应用场景

当没有缓存时,程序的调用流程时这样的:
在这里插入图片描述

此时,对数据库来说,压力时非常大的,因为每次的查询数据都要查询数据库。那么有没有办法来减缓数据库的压力呢?肯定是有的,那就是引入缓存

当有缓存时,程序的调用流程时这样的:
在这里插入图片描述

这样改造之后,程序就不会直接去查询数据库,而是先访问缓存,当缓存中没有需要的数据时,才会去查询数据库。这样的话,数据库的压力就大大减小了。

1.3 引入缓存后的执行流程

在这里插入图片描述

1.4 缓存的优点

  1. 缓存一般都是 key-value 查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高;
  2. 缓存的数据是存储在内存中的,而数据库的数据是存储在磁盘中的,因为内存的操作性能远远大于磁盘,因此缓存的查询效率会高很多;
  3. 缓存更容易做分布式部署(当一台服务器变成多台相连的服务器集群),而数据库一般比较难实现分布式部署,因此缓存的负载和性能更容易平行扩展和增加。

2. 缓存穿透

2.1 场景

场景1:用户请求的id不存在
场景2:用户伪造不存在的id发起请求

上面两种场景就会导致,每次都在缓存中拿不到数据,每次需要查询数据库,并且在数据库中也查不到数据。

这种场景就好像缓存被穿透了一样,每次都会访问数据库。此时就会到导致数据库的压力非常大,容易使数据库挂掉。

2.2 解决策略

1. 参数校验

对用户传送过来的数据进行校验,不符合规定,就直接将相互请求拦截掉。

  1. 当数据比较少时,就可将数据库中的数据全部放入内存的一个map当中。

  2. 当数据量比较大时,全部放入内存就不可取,此时就得使用布隆过滤器,它底层使用bit数据,数据默认值都为0

关于布隆过滤器:

  1. 它底层使用bit数据,数据默认值都为0
  2. 它在第一次初始化的时候,会把数据库中已存的key,经过一些hash的哈希算法,每个key都会计算出多个位置,然后将这些位置上的元素值设置为1。
  3. 之后,如果有用户请求的时候,就会使用相同的hash算法算出key对应的位置,如果多个位置中值都是1,就说明该key在数据库中存在,此时就允许后续的操作。如果有任意一个位置上的值不是1,那就说明该值在数据库中不存在,直接拒接请求

使用布隆过滤器的缺点;

  1. 存在误判的情况——产生hash冲突时
  2. 存在数据更新问题——数据库和布隆过滤器是异步同步的,当发生网络异常时,就可能导致数据不一致的问题。

2. 缓存空值

当某个key在缓存中查不到,在数据库中也查不到时,此时,将该key缓存起来,让它的value为null。当后面的请求又拿着相同的key时,就直接返回null了,无需再进行数据库的查询。

3. 缓存击穿

3.1 场景

当某一个热key到达过期时间失效后,使得大批的请求访问数据库

在这里插入图片描述

3.2 解决策略

  1. 通过加锁限制访问:对于同一个key,同一时刻只能有一个请求访问,访问成功后,将数据再次放入缓存当中。
  2. 单独设置一个job,给即将过期的热key自动续期在这里插入图片描述
  3. 对于一些十分热的key,它的数量并不是很多,所以就可以给它们不设置过期时间,等使用完之后,手动删除掉这些热key即可

4. 缓存雪崩

4.1 场景

当某多个热key到达过期时间失效后,使得大批的请求访问数据库

在这里插入图片描述

4.2 解决策略

要解决缓存雪崩,就要想办法为不同的key设置不用的过期时间

方法:在设计的过期时间的基础上加上一个160s的随机数,

即:时间过期时间 = 过期时间 + 160s的随机数

当有可能出现主机宕机的情况时:

  1. 如果使用的是redis,就可以使用哨兵模式或者集群模式,避免出现单节点故障而导致的整个redis拂去不可用
  2. 如果做了上面的处理,redis还是挂了,这是就需要做服务降级了。需要配置一些默认兜底的数据,程序中有一个默认的全局开关,比如有十个请求在最近一分钟内从redis中获取数据失败,则全局开关打开,后面的新请求就直接从配置中心获取默认的数据

5. 上面三者的区别

  1. 缓存穿透是说 查询不存在

  2. 缓存击穿、缓存雪崩是说 热key失效

  3. 缓存击穿是一个热key失效,缓存雪崩是多个热key失效

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

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

相关文章

图像分割--入门了解

一. 三种分割 1. 语义分割(semantic segmentation) 语义分割:语义分割通过对图像中的每个像素进行密集的预测、推断标签来实现细粒度的推理,从而使每个像素都被标记为一个类别,但不区分属于相同类别的不同实例。 比…

ChatGPT之父:世界正被他搅动

阿尔特曼(左)与马斯克Mac LC2电脑ChatGPT这款聊天应用程序最近太火了! 美国北密歇根大学的一名学生用它生成了一篇哲学课小论文,“惊艳”了教授,还得到了全班最高分。美国一项调查显示,53%的学生用它写过论…

Vue (2)

文章目录1. 模板语法1.1 插值语法1.2 指令语法2. 数据绑定3. 穿插 el 和 data 的两种写法4. MVVM 模型1. 模板语法 root 容器中的代码称为 vue 模板 1.1 插值语法 1.2 指令语法 图一 : 简写 : v-bind: 是可以简写成 : 的 总结 : …

Springboot + RabbitMq 消息队列

前言 一、RabbitMq简介 1、RabbitMq场景应用,RabbitMq特点 场景应用 以订单系统为例,用户下单之后的业务逻辑可能包括:生成订单、扣减库存、使用优惠券、增加积分、通知商家用户下单、发短信通知等等。在业务发展初期这些逻辑可能放在一起…

【23种设计模式】创建型模式详细介绍

前言 本文为 【23种设计模式】创建型模式详细介绍 相关内容介绍,下边具体将对单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,具体包括它们的特点与实现等进行详尽介绍~ 📌博主主页&…

计算机组成原理(一)

1.了解计算机硬件的发展和软件的发展历程; 硬件:   电子管时代(1946-1959):电子管、声汞延迟线、磁鼓   晶体管时代(1959-1964):晶体管、磁芯   中、小规模集成电路时代&#…

OpenStack云平台搭建(1) | 基础环境准备

目录 一、环境准备 1.1、关闭selinxu 1.2、关闭防火墙 1.3、修改主机名 1.4、配置时间同步服务器 1.5、配置域名 二、安装OpenStack库 2.1、启用OpenStack仓库的包 2.2、安装python-openstackclient 2.3、controller安装数据库 2.4、安装消息队列 2.5、配置缓存 2.…

Linux驱动开发基础__中断的线程化处理

目录 1 引入 2 内核机制 2.1 调用 request_threaded_irq 后内核的数据结构 2.2 request_threaded_irq 2.3 中断的执行过程 1 引入 复杂、耗时的事情,尽量使用内核线程来处理。工作队列用起来挺简单,但是它有一个缺点:工作队列中有多个 …

【Java 面试合集】HashMap中为什么要使用红黑树

HashMap中为什么要使用红黑树1. 概述 从源码的结构方面讲述下为什么HashMap要使用红黑树。那没有红黑树的时候,底层是基于什么逻辑进行存储的。 2. 底层结构 如果忽略红黑树的话,HashMap底层的数据存储结构如下: 总体而言就是数组 链表的形…

Vscode使用

我是四五年的webstorm忠粉,一直觉得它是世界上最好用、强大、方便的编辑器。 为了它深谙各种破解方法,突然有一天我知道的几种方法都不奏效了。破解的实在太累了,算了,尝试尝试不同的工具吧。 含泪挥别webstrom,捏着…

JDBC编程复习

文章目录JDBC1.概念2.原理3. 如何使用JDBC编程1. 下载mysql的jdbc驱动2. 项目中引入驱动4. JDBC使用1. 和数据库建立连接2.获取连接3. Statement对象4. 释放资源JDBC 1.概念 JDBC,即Java Database Connectivity,java数据库连接。是Java提供的API用来执行SQL语句&a…

SWPU新生赛WriteUp

一个线上赛,这个NSSCTF最爽的就是没有靶机操作的一分钟冷却,10.11比赛结束,但是我还要看看工控,所以不打这个比赛了,先把wp写了,pwn入门真TM艰难 WEB 前面送分题,中间的也是基础题,…

SQL概述及数据定义

文章目录一、SQL概述1.简介2.特点3.组成4.SQL分类5.书写规范二、数据定义1.模式的定义与删除①定义模式②删除模式2.基本表的定义、删除与修改①定义基本表②数据类型③模式与表④修改基本表⑤删除基本表3.索引的建立与删除①建立索引②删除索引一、SQL概述 1.简介 SQL (Stru…

使用IDA查看汇编代码上下文去辅助排查C++软件异常问题

目录 1、概述 2、汇编指令能最直接反映异常崩溃的原因 2.1、查看异常Code码及对应的异常类型 2.2、查看发生崩溃的那条汇编指令 3、阅读汇编代码上下文需要掌握一定的基础汇编知识 4、Windbg中显示的函数调用堆栈中的C代码行号,和最新的代码对不上了 5、Wind…

openGL学习之GLFW和GLAD的下载和编译

背景:为什么使用GLFW和GLADOPenGL环境 目前主流的桌面平台是GLFW和GLAD之前使用的GLUT和Free GLUT已经基本淘汰了,所以记录一下如何下载GLFW和GLAD并且编译.GLFW下载:An OpenGL library | GLFW复制到你想存放的位置,我这里就存放到C盘Libaray文件夹下了,这里是我存放…

算法训练营 day37 贪心算法 K次取反后最大化的数组和 加油站 分发糖果

算法训练营 day37 贪心算法 K次取反后最大化的数组和 加油站 分发糖果 K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标…

Eclipse 版本升级记录

前言 Eclipse 不是不能在线升级,至少没有找对方法,下面就让我来一步一步带你学会它、使用它吧! 一、概念 Eclipse主要分为两个概念,一个是在线升级 Eclipse 新版本,另一个是在线升级 Eclipse 插件,这两个是有很大区…

【记录】ChatGPT使用记录

文章目录2023年02月08日数学哲学Java其他2023年02月09日ChatGPT网络根据对话的日期、问题的类型进行整理 2023年02月08日 数学 感想:数学应该没啥问题,感觉只要自然语言没理解错了,剩下就不是事 积分 代数 哲学 哲学问题的回答就属于模棱…

JetpackCompose从入门到实战学习笔记7—Dialog的简单使用

JetpackCompose从入门到实战学习笔记7—Dialog的简单使用 1.Dialog对话框 Dialog的参数如下: Composable fun Dialog(onDismissRequest: (() -> Unit)?, //关闭对话框的回调properties: DialogProperties! DialogProperties(), //自定义对话框的属性content: ( Compose…

智能无障碍轮椅——汇总

文章目录一、设计内容二、控制理论三、材料列表四、控制图五、硬件介绍1、TB6612FNG电机驱动模块2、DX-BT04 2.0蓝牙模块3、MPU6050陀螺仪模块4、电源模块5、520编码器直流减速电机六、PID理论与算法控制七、代码解析八、参考博文一、设计内容 使用 STM32 作为主处理器进行开发…