Redis的缓存穿透?缓存击穿?缓存雪崩?

缓存穿透

什么是缓存穿透?

假如我们有一个学生表一共有10条数据,对应的id为1-10。我们有一个请求是通过id去查询学生的信息。正常的流程是请求先到redis里面去找,如果命中就将查询到的结果反回,如果没有就去mysql数据库中找,并将结果返回,同时存到redis当中。但是如果我们请求查询一个数据库中不存在的id,那么每次mysql数据库查询不到数据,也不会存入redis中,就会导致每次查询这样不存在的数据都会直接查找数据库。黑客可以运用这一点,发送大量不存在数据的请求,来对我们进行攻击。

解决缓存穿透的方法

  1. 方案1:缓存空数据,及时查询结果为null,也将这个结果存入redis
  • 优点:操作简单
  • 缺点:消耗内存,如果mysql数据库中新插入了所对应的数据,但是redis中存储的可能仍是null,会导致不一致问题。
  1. 方案2:布隆过滤器

在缓存预热阶段,预热布隆过滤器,在请求去redis中查询之前,现在布隆过滤器中进行查询所要查询的id是否存在于布隆过滤器中,如果不存在直接返回,如果存在再去redis中进行查询。(布隆过滤器的实现依赖于bitmap,是一个以bit为单位的数组,只能存储0/1,比如我们把id=1,存储到布隆存储器中,需要经过3个hash函数的计算,让某些下标为1,那么查询某个id是否存在,就是将传过来的id用相同的函数计算,看看布隆过滤器中对应的位置是否都为1,但是存在误判率。比如经过函数三个函数计算,bitmap中下标 1 ,5 ,8 ,9 ,11 ,15被标记为1,这时传过来一个不存在的id,但是这个id通过三个哈希函数的计算,认为如果5,8,15,这三个下标位置为1就视为这个id存在,这样就造成了误判)

可通过Redisson或Guava去实现布隆过滤器。

  • 优点:内存占用较少
  • 缺点:实现复杂,可能存在误判。

缓存击穿

什么是缓存击穿

在redis中给某个key设置了过期时间,但是当redis过期的时候恰好有对这个key的大量请求发了过来,这些并发的请求可能会瞬间把数据库压垮。

在redis查询不到数据,会去数据库中查询然后再次在redis中记录,那么为什么还会把数据库压垮呢?

因为所要查询的数据可能是要联合很多张表去查询,就会消耗较长的时间,无法去快速写入到redis。

如何解决缓存击穿

方案1:互斥锁

在第一个访问的线程后发现缓存未命中,让他获取到锁,接着去查询数据库并重建缓存,在释放锁之后其他线程才能在缓存中获取数据。如果在线程1释放锁之前,有其他线程来查询该数据,就会获取互斥锁失败,休眠一会后再重试查询该数据。

特点
  • 强一致(每个线程查询到的数据保证都是一样的)
  • 性能差(在第一个获取到锁的线程释放锁之前,其他线程要休眠和重试查询,浪费性能)

方案2:逻辑过期

在redis中并不设置过期时间,而是在数据库中加入一个逻辑过期时间的字段。在查询缓存中发现逻辑过期时间已经过期,那么他就会获取一个互斥锁,并创建一个新的线程2,由这个线程去查询数据库并重建缓存数据,写入缓存后重置逻辑过期时间,然后释放锁。而线程1并不等待线程二去完成这些流程,在获取到互斥锁之后,线程1直接返回过期的数据。如果在线程二释放锁之前,又有其他线程去访问这条数据,那么也会返回过期数据。而线程2释放锁之后再有=线程访问该条数据,就会缓存命中,返回没有过期的数据。

特点
  • 高可用,性能优(不用像方法一那样让其他线程一直等待,而是直接返回过期的数据)
  • 但是不能保持数据的一致性(过期的数据可能和没有过期的数据不一致)

缓存雪崩

什么是缓存雪崩

缓存雪崩是指在同一时段大量的key失效/或者Redis服务器宕机,导致大量请求到达服务器,带来巨大的压力。

解决方案

  1. .给不同的Key的TTL添加随机值
  2. 利用Redis集群提高服务的可用性
  3. 给缓存业务增加降级限流策略(降级可作为系统的保底策略,适用于穿透、击穿、雪崩
  4. 给业务添加多级缓存

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

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

相关文章

chatgpt与人类有何不同?

ChatGPT和人类之间存在多个显著的差异。 首先,ChatGPT是一种基于人工智能技术的计算机程序,通过机器学习和自然语言处理等技术,从大量的数据中获取知识并生成语言输出。它主要依赖于算法和数据进行工作,能够迅速处理和检索信息&a…

OpenCV(六)——对于图片的算术运行、图片的叠加操作、多通道图像拆分为多个单通道图像

在OpenCV中,可以对于图片进行算法运算。我们知道,图像的本质其实就是矩阵,因此对于图像的算数运算本质上就是对于矩阵的算术运算。在OpenCV可以对图像进行算术运算的操作有加、减、乘、除等操作。 图像的加、减、乘、除操作 两张图像可以进…

微信小程序开发系列(二十六)·小程序运行机制(启动、前后台状态、挂起、销毁)和小程序更新机制

目录 1. 小程序运行机制 1.1 启动 1.2 前台和后台状态 1.3 挂起 1.4 销毁 2. 小程序更新机制 1. 小程序运行机制 1.1 启动 小程序启动可以分为两种情况,一种是冷启动,一种是热启动。 冷启动:如果用户首次打开,或小…

数据挖掘案例分析、经典案例、技术实现方案

1.数据挖掘案例分析 数据挖掘:是从大量数据中发现有用信息和模式的过程。 数据挖掘案例分析:是指通过对已有数据进行挖掘和分析,发现其中的模式和规律,并根据这些发现提出相应的解决方案和决策建议的过程。 以下是一些常见的数据…

Java中交集、并集、差集、补集

一、交集 //交集Testpublic void intersection(){//向集合中添加元素ArrayList<String> datas new ArrayList<>();Collections.addAll(datas, "张三", "李四", "王五", "赵六");//向集合中添加元素ArrayList<String&…

03-快速上手RabbitMQ的5种消息模型

RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件,有几个常见概念 connections(连接): 将来publisher(消息的发送者)或者consumer(消息的接收者)都需要先与MQ建立连接 channel(通道): 建立连接后需要创建通道,生产者和消费者就是基于通道完成消息的发送和接收 ex…

django自定义表单

文章目录 django自定义表单两种方式自定义错误信息widgets实例化和初始化处理用户提交的数据验证表单通用类试图使用表单Formset django自定义表单 两种方式 继承Form类继承ModelForm类 from django import forms from .models import Contact# 自定义表单字段 class Contac…

_note_06

1.说一说函数的按地址传递和按值传递&#xff0c;他们的区别是什么&#xff1f; 函数的参数传递方式可以分为按地址传递&#xff08;也称为按引用传递&#xff09;和按值传递两种方式。按值传递是指将实际参数的值复制给形式参数&#xff0c;即在函数调用时&#xff0c;实际参数…

探索云原生数据库技术:构建高效可靠的云原生应用

数据库是应用开发中非常重要的组成部分&#xff0c;可以进行数据的存储和管理。随着企业业务向数字化、在线化和智能化的演进过程中&#xff0c;面对指数级递增的海量存储需求和挑战以及业务带来的更多的热点事件、突发流量的挑战&#xff0c;传统的数据库已经很难满足和响应快…

2023年终总结——跌跌撞撞不断修正

目录 一、回顾1.一月&#xff0c;鼓足信心的开始2.二月&#xff0c;焦躁不安3.三月&#xff0c;路还是要一步一步的走4.四月&#xff0c;平平淡淡的前行5.五月&#xff0c;轰轰烈烈的前行6.六月&#xff0c;看事情更底层透彻了7.七月&#xff0c;设计模式升华月8.八月&#xff…

04hive数仓内外部表复杂数据类型与分区分桶

hive内部表和外部表 默认为内部表&#xff0c;外部表的关键字 &#xff1a;external内部表&#xff1a;对应的文件夹就在默认路径下 /user/hive/warehouse/库名.db/外部表&#xff1a;数据文件在哪里都行&#xff0c;无须移动数据 # students.txt 1,Lucy,girl,23 2,Tom,boy,2…

Python实战:Python常用IDE选择

在Python编程的旅程中&#xff0c;选择一个合适的开发环境至关重要。本文将详细介绍三种流行的Python开发环境&#xff1a;PyCharm、VS Code和Jupyter Notebook。我们将探讨它们的特点、安装步骤、基本使用方法&#xff0c;并通过具体的代码示例来展示如何在这些环境中编写和运…

Python中,括号内部的for循环(列表推导式)

在Python中&#xff0c;括号内部的for循环通常用于列表推导式&#xff08;list comprehension&#xff09;&#xff0c;这是一种简洁创建列表的方式。列表推导式可以使用任何可迭代对象内的元素来创建新的列表元素。 列表推导式的基本语法结构如下&#xff1a; [expression f…

Kafka的分区机制

Kafka的分区机制是其核心功能之一&#xff0c;旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理&#xff1a; Kafka分区基本概念 分区&#xff08;Partition&#xff09;&#xff1a;Kafka中的主题&#xff08;Topic&#xff09;可以细分为多个分区…

政安晨:【深度学习处理实践】(五)—— 初识RNN-循环神经网络

RNN&#xff08;循环神经网络&#xff09;是一种在深度学习中常用的神经网络结构&#xff0c;用于处理序列数据。与传统的前馈神经网络不同&#xff0c;RNN通过引入循环连接在网络中保留了历史信息。 RNN中的每个神经元都有一个隐藏状态&#xff0c;它会根据当前输入和前一个时…

Java EE之wait和notify

一.多线程的执行顺序 由于多个线程执行是抢占式执行&#xff0c;就会导致顺序不同&#xff0c;同时就会导致出现问题&#xff0c;就比如俩个线程同时对同一个变量进行修改&#xff0c;我们难以预知执行顺序。 但在实际开发中&#xff0c;我们希望代码按一定的逻辑顺序执行&am…

AI辅助研发:引领科技创新的未来之路

随着人工智能技术的快速发展和广泛应用&#xff0c;AI辅助研发正逐渐成为科技界和工业界的焦点。2024年&#xff0c;作为AI技术进一步成熟的见证者&#xff0c;我们正处于AI辅助研发的黄金时代。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI的影响力已…

计算机视觉——P2PNet基于点估计的人群计数原理与C++模型推理

简介 人群计数是计算机视觉领域的一个核心任务&#xff0c;旨在估算静止图像或视频帧中的行人数量。在过去几十年中&#xff0c;研究人员在这个领域投入了大量的精力&#xff0c;并在提高现有主流基准数据集性能方面取得了显著进展。然而&#xff0c;训练卷积神经网络需要大规…

matlab阶段学习笔记小节2

syms定义符号变量 求极限 第二题 第三题 limit(y,n,inf);求的的函数y关于自变量n在无穷处&#xff08;inf&#xff09;的极限 exp(2)即指数为2&#xff0c;底为e,也就是e^2 求导数 第一题 log(x)默认是以e为底的指数函数&#xff0c;也就是ln(x). 使用diff(f)对函数进行求…

今日份总结

1&#xff1a;标题 <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> 可以用快捷键&#xff1a;h$*6 (表示一到六级标题) 2&#xff1a;段落 <p>这是一个段落</p> 3&#xff1a;换行 <p>这是一个段落&l…