缓存雪崩和缓存穿透的解决方案

news2024/12/23 17:20:28

缓存雪崩

缓存雪崩是指存储在缓存里面的大量数据,在同一时刻全部过期,大部分流量直接到达了数据库,导致数据库压力增加,造成数据库崩溃的情况。

缓存雪崩的解决方案如下:

  • 每个缓存的key设置不同的过期时间
  • 采用多级缓存策略,使用Redis+Memcache组合进行缓存
  • 配置服务的限流措施

缓存穿透

缓存穿透是指在短时间内有大量缓存中不存在的Key请求到数据库,增加了数据库的压力。这个场景的核心问题是针对缓存的一种攻击行为,请求的Key不仅不存在于缓存中,甚至不存在于数据库中,这种类型的Key长时间的大量的到达数据库,造成了数据库崩溃的情况。

缓存穿透的解决方案如下:

  • 把无效的Key也保存在Redis里面,并且设置默认值,比如设置为null。这样第一次请求查询不到的时候,就会把Key写到缓存中,第二次请求就不会到达数据库。
  • 如果攻击者不断用随机的不存在的Key攻击数据库,那么还是会存在缓存穿透的问题。那么我们就需要想一个办法,在第一次请求的时候就识别出无效的Key,在请求Redis和DB前就识别出来,如果不存在就直接返回。那么我们是否可以提前把全部数据存储在缓存中,比如用Set存储?答案是否定的,因为如果有几亿条数据,甚至更多,那么缓存肯定是无法容纳的。这时我们就需要使用布隆过滤器了。

布隆过滤器

布隆过滤器是一个用来检查一个Key是否存在的数组,它采用了bitMap存储数据,长度为m,仅包含0和1,初始化时默认值都为0,表示数据不存在。它的特点是:

  • 占用空间少
  • 判断Key存在的时候,Key不一定存在,但是判断Key不存在的时候,Key一定不存在
  • 可以添加Key,到那时不能删除Key,因为删除Key会增加误判率

 当我们往布隆过滤器里面添加数据时,为了避免地址冲突,我们会使用多个hash函数对Key进行hash运算,算得一个数值,然后对数组长度进行取模运算的到一个下标位置,每个hash值取模运算会得到不同的下标位置,把每个位置都设置为1,就完成了添加数据的操作。

在这里插入图片描述

当我们查询Key的时候,会先把Key用多个不同的hash函数进行hash运算,再对数组长度尽心取模运算得到多个下标位置。如果结果都是1,表示Key有可能存在;如果有一个为0,则这个Key一定不存在。

为什么说是有可能存在?

因为这些位置的1可能是其他Key存在导致的,也就是存在hash冲突的可能。由此可见,布隆过滤器只能判断Key一定不存在的情况,如果判断Key存在的情况,还是有可能直接到达数据库的,所以布隆过滤器会大幅降低缓存穿透的可能,但并不会完全解决。

为什么Key不能删除?

因为hash冲突,所以某个下标位置可能是其他Key的存在导致的,如果删除了这个下标位置,那么查询别的Key的时候,可能会导致查询失败。

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

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

相关文章

STM32单片机(九)USART串口----第四节:USART串口实战练习(串口发送+接收)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

在 K8S 中部署一个应用 下

接着上一篇继续部署应用到 K8S中 之前简单部署的简单集群,三个工作节点是运行在 docker 和 kubelet 的,还有一个是控制节点 ReplicationController , pod 和 service 本次关系 之前有提到 ReplicationController , pod 和 服务…

设计模式之命令模式笔记

设计模式之命令模式笔记 说明Command(命令)目录命令模式示例类图订单类厨师类抽象命令类订单命令类服务员类测试类 说明 记录下学习设计模式-命令模式的写法。JDK使用版本为1.8版本。 Command(命令) 意图:将一个请求封装为一个对象,从而使得可以用不同的请求对客…

STM32单片机(九)USART串口----第二节:USART串口外设

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

常见面试题之MySQL篇

1.MySQL中,如何定位慢查询? 我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接…

【数据库七】MySQL主从复制与读写分离

MySQL主从复制与读写分离 1.案例概述2.什么是读写分离?3.为什么要读写分离呢?4.什么时候要读写分离?5.主从复制与读写分离6.MySQL主从复制原理6.1 mysql的复制类型 7.主从复制的工作过程7.1 MySQL架构图7.2 口语化工作工程 8.MySQL 读写分离原…

VSCode配置C语言编译环境

一、下载C语言编译器: (1)下载地址:MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64 at SourceForge.net 下载如下的windows版本: (2)配置环境变量: 二、安装VSCode …

Linux学习[18]bash学习深入4----命令执行的判断依据---【; , , ||】---用于一次性输入多指令情况

文章目录 前言判断符号 ;判断符号 &&与||总结 前言 使用指令的时候,使用完一个指令之后,我想让它接着执行另一个指令,而非等A指令执行完之后再输入B指令。 为了实现这个效果,我查阅了相关资料,这里…

【从零开始学习JAVA | 第十六篇】杂项知识点介绍

目录 前言: 包: final: 权限修饰符: 总结: 前言: 本文不隶属于正文序列,而是对面向对象中的一些常用词进行介绍,方便大家理解记忆,本文将会逐一介绍 什么是包,final…

云服务器部署企业版openGauss

openGauss 企业版安装 教程 1.下载安装包 在华为云上租一台服务器,操作系统选:openEuler 20.03 64bit (64-bit) 获取openGauss Server安装包,企业版:软件包链接 使用xshell连接服务器,准备软硬件安装环境(该装的依…

【软件架构模式】—微内核架构

欢迎回到软件架构模式博客系列。这是本系列的第 4 章,我们将讨论微内核架构模式 概述: 内核模式也被称为插件架构模式。将附加应用程序功能作为插件添加到核心应用程序,以提供可扩展性以及功能分离和隔离。 这种模式由两种类型的架构组件组…

如何搭建LNMP架构

目录 一、什么是LNMP Linux系统 Apache服务 Nginx服务 MySQL数据库 PHP服务 二、搭建LNMP 安装Nginx服务 第一步 关闭防火墙和安全机制 第二步 安装依赖环境 第三步 创建运行用户 第四步 解压服务包 第五步 编译安装 第六步 编译 第八步 添加 Nginx 系统服务 …

leetcode63. 不同路径 II(动态规划-java)

不同路径 II leetcode63. 不同路径 II题目描述暴力递归代码演示动态规划代码演示 动态规划空间压缩 动态规划专题 leetcode63. 不同路径 II 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/unique-paths-ii 题目描述 一个…

自然图像中的字符识别:Chars74K 数据集

字符识别是 研究人员从计算机早期开始工作 视觉。随着当今相机的无所不在,应用 的自动字符识别比以往任何时候都更广泛。为 拉丁字母,这在很大程度上被认为是一个已解决的问题 受限情况,例如扫描文档的图像 包含常用字符字体和统一 背景。但是…

7.4_3B+树

特点:块内无序,块间有序(类比于分块查找) 这个性质是为了追求平衡 3)结点的子树个数与关键字个数相等 4)所有叶节点包含全部关键字及指向相应记录的指针,叶节点中将关键字按照大小顺序排列, 并且相邻叶节点…

Camera之android8.0以上HIDL与C++数据类型转换(三十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

rust 集合、错误处理、泛型、Trait、生命周期、包

集合组织特性相同的数据;泛型可以定义任何抽象数据类型;生命周期限制所有权的作用域范围;错误处理使程序更健壮。 集合 一组特性相同的数据集合,除了基本数据类型的元组、数组。rust 标准库提供了一些非常有用的数据结构。 Vec…

Redis从入门到精通【进阶篇】之高可用主从详解

文章目录 0.前言1.详解1.1 主从复制概述1.2 主从复制原理1.2.1.全量复制1.2.2.增量复制1.2.3.详细描述1.3 更深入理解1.4 常见面试题 2. 总结3. Redis从入门到精通系列文章 0.前言 Redis是一个高性能的键值存储系统,广泛应用于Web应用、缓存、消息队列等领域。在实…

C++【STL】之priority_queue学习

优先级队列 优先级队列priority_queue也是STL库中容器适配器的一种,常用于进行数据优先级的处理,说到这儿是不是发现有些熟悉,没错它和我们之前讲解的堆本质上就是一个东西,底层都是数组存储的完全二叉树,它在STL库中…