缓存穿透

缓存穿透是指当用户对Redis发出无效或者不存在的数据信息操作时,这条数据在Redis中不存在,Redis就会在MySQL数据库中查询,可时无效的信息在mysql数据库中也不存在,就会造成Redis一直查询MySQL,对MySQL造成极大压力

解决方式

方式一:返回缓存空值

这种方式有点像“以牙还牙”,对于你的不存在信息,Redis没有就先会查MySQL,MySQL也没有就为你返回一个空值,虽然是空值,但是我至少返回了。

但是这种方式是存在却缺陷的,举个例子:

比如说有个黑客对你的Redis发出来查询 id=-1 的信息,我们知道,id都是大于等于0的,不过好在你有返回空值的方式,驳回了他“无理的请求”,以后他在输入id=-1,Redis直接记住了,直接驳回。

但是这时候这名黑客 接连输入了 id=-2、-3、-4...,这下Redis傻了,对于这么多“无理的请求”,只好不断去问“大哥MySQL”。

大哥MySQL也烦了,就崩溃了。Redis也存了一肚子的空值

所以,若是有不同形式的无效信息,redis需要一直查询MySQL,MySQL没有后返回大量的空值在Redis中。你可得记住,空值不是空,空值也是值。

方式二:布隆过滤器

布隆过滤器是一种过滤器,本质上布隆过滤器是一种基于概率的数据结构,比较巧妙的概率性数据结构,特点是高效的插入和查询。可以用来告诉你“某样东西一定不存在或可能存在”

注:布隆过滤器一定可以判断不存在,但是对判断存在会有误差

缓存击穿

缓存击穿是指 Redis 缓存中有一些的热点数据 key 同时过期失效,或有一些非热点数据 Key 突然有大量的并发访问请求,这样会导致大量的并发请求直接穿透 Redis 缓存,涌入MySql数据库,巡检增大数据库的访问压力,甚至崩溃

解决方式

方式一:永不过期

就是设置 key 永不过期,就不会出现大量 key 过期失效的问题, 优点是维护简单,缺点是占用空间。且对于非热点数据的高并发访问无效

方式二:加锁

对于 Redis 缓存中 key 过期时,在 key 要查询 MySQL 数据库的时候加锁,这时只能让第一个请求进行查询数据库,然后把从数据库中查询到的值存储到 Redis 缓存中,对于其他的相同的 key 查询,可以直接从 Redis 缓存中获取即可

缓存雪崩

缓存雪崩是指在某一个时间段内,Redis缓存突然宕机或大量的 key 集中过期失效,如果这个时间段内有大量请求,而查询数据量巨大,所有的请求都会达到Mysql 数据库,数据库的访问量会暴增,引起数据库崩溃

解决方案

下图所示:

  • 图1的解决方式就是扩展redis的数量,防止大量数据涌入或单个redis服务器的崩坏。
  • 图2是当缓存已经失效时,通过加锁和队列来限制数据流量降低操作级别
  • 图3的目的将可能访问的数据提前放入redis中
  • 图4就是设置多个过期时间,以便于redis中的数据不会在同一时间全部失效

总结区分

上面的内容中若是不小心,很容易就会搞混淆。比如名字上很难区分穿透和击穿,概念上击穿和雪崩又有点相似。没事,看完下面保证你明明白白:

首先是穿透和击穿,我们从直觉上来说,击穿是不是比穿透跟尖锐一点

没错,你的感觉是对的。

我很喜欢举个例子:

你走在路上,遇到一个人对你突然无理取闹。

你只是会觉得这人神经病吧?!但是你对于他这种”无理的语言“,左耳朵进,右耳朵出,他的话只是穿过你的耳朵。结合上述穿透的例子,有感觉没?

但是如果你走在路上,有人对你的眼睛扔了个小石头。如果你平时戴眼镜,用的力气大一点就会击穿你的眼镜玻璃...

没事,不要紧张,只是个例子。

这说明保护眼睛十分重要的,尤其是作为程序员的我们,看完这篇就可以休息一下眼睛了。

这下应该可以深刻的体会到两者区别了吧

其次是击穿和雪崩

对比一下概念,这两个整的是太像了,感觉都是Redis中数据失效,直接去查MySQL数据库的。

我们还是用心感觉一下两个词,如果说击穿是尖锐的,那么雪崩就和他的名字一样

感觉上是不是雪崩就比击穿范围要大,击穿可以是面,但在雪崩面前,他就是点。

击穿的重点是,我的操作的信息本该打到Redis上的,可是Redis中存的过期了,打穿了。

雪崩的重点是,Redis本是缓存系统假设缓存了100条,我突然查了10000000条数据进去,不崩才怪。

创作不易,转载可私信。未经同意禁止转载!!!

看完包你搞懂Redis缓存穿透、击穿和雪崩!!!说到做到的更多相关文章

  1. 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...

  2. Windows PowerShell是啥?看完本文你就懂它了

    这篇文章主要介绍了Windows PowerShell是啥?Windows PowerShell是什么?Windows PowerShell有哪些特性?Windows PowerShell有什么用?看 ...

  3. redis与mysql性能对比、redis缓存穿透、缓存雪崩

    写在开始 redis是一个基于内存hash结构的缓存型db.其优势在于速读写能力碾压mysql.由于其为基于内存的db所以存储数据量是受限的. redis性能 redis读写性能测试redis官网测试 ...

  4. Redis 缓存穿透

    Redis 缓存穿透 https://www.cnblogs.com/jiekzou/p/9212114.html 场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容 ...

  5. Redis缓存穿透,缓存击穿,缓存雪崩,热点Key

    导读 使用Redis难免会遇到Redis缓存穿透,缓存击穿,缓存雪崩,热点Key的问题.有些同学可能只是会用Redis来存取,基本都是用项目里封装的工具类来操作.但是作为开发,我们使用Redis时可能 ...

  6. Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)

    阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...

  7. redis缓存穿透穿透解决方案-布隆过滤器

    redis缓存穿透穿透解决方案-布隆过滤器 我们先来看一段代码 cache_key = "id:1" cache_value = GetValueFromRedis(cache_k ...

  8. Redis缓存穿透和缓存雪崩以及解决方案

    Redis缓存穿透和缓存雪崩以及解决方案 Redis缓存穿透和缓存雪崩以及解决方案缓存穿透解决方案布隆过滤缓存空对象比较缓存雪崩解决方案保证缓存层服务高可用性依赖隔离组件为后端限流并降级数据预热缓存并 ...

  9. 预防Redis缓存穿透、缓存雪崩解决方案

    最近面试中遇到redis缓存穿透.缓存雪崩等问题,特意了解下. redis缓存穿透: 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有.这样就导致用户查询的时候,在缓存中找不到,每次都要去 ...

  10. redis缓存穿透,缓存击穿,缓存雪崩

    概念解释 redis 缓存穿透 key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源.比如用一个不存在的用户id获取用户信息,不论缓存还是数据库 ...

随机推荐

  1. 【WebGL系列-03】获取shader变量地址及赋值

    获取shader变量地址及赋值 上一节创建了WebGL程序对象,创建好program对象后,对象中包含顶点着色器和片元着色器,着色器中含有变量,我们需要对其进行赋值后才能够进行绘制. 着色器代码如下: ...

  2. pssh 安装使用

    which python # 查看python 是否指向 python2 ll /usr/bin/python # lrwxrwxrwx. 1 root root 7 2020-03-24 03:08 ...

  3. 【pandas小技巧】--修改列的名称

    重命名 pandas 数据中列的名称是一种常见的数据预处理任务.这通常是因为原始数据中的列名称可能不够清晰或准确.例如,列名可能包含空格.大写字母.特殊字符或拼写错误. 使用 pandas 的 ren ...

  4. FreeRTOS 基于 ARMv8-M 对 MPU 的应用

    一.前言 ARMv8-M 支持 MPU,FreeRTOS 也添加了对这些 MPU 的应用代码.这里用来记录 FreeRTOS 对 MPU 应用方式的探究结果. 二.ArmV8-M MPU 介绍 ARM ...

  5. 【技术积累】Linux中的命令行【理论篇】【四】

    ar命令 命令介绍 ar命令是Linux系统中的一个工具,用于创建.修改和提取静态库文件(archive files).静态库文件是一组已编译的目标文件的集合,可以被链接到可执行文件中. 命令说明 a ...

  6. Cilium系列-14-Cilium NetworkPolicy 简介

    系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容. 网络策略(N ...

  7. 基于CUBEMX的STM32F4 Hal库,配置LVGL(无操作系统版)

    本篇文章移植思路适用于所有嵌入式MCU,包括Arm,STM32,NXP,乐鑫,Nuvoton,Arduino,RT-Thread,Zephyr,NuttX,Adafruit等等. 为什么要写这一篇移植 ...

  8. 不重启Docker能添加自签SSL证书镜像仓库吗?

    应用背景 在企业应用Docker规划初期配置非安全镜像仓库时,有时会遗漏一些仓库没配置,但此时应用程序已经在Docker平台上部署起来了,体量越大就越不会让人去直接重启Docker. 那么,不重启Do ...

  9. 【技术积累】Linux中的命令行【理论篇】【十】

    bunzip2 命令说明 bunzip2命令是Linux系统中的一个用于解压缩文件的命令.它可以解压缩使用bzip2算法压缩的文件,将其恢复为原始的未压缩文件. 命令介绍 bunzip2命令的语法如下 ...

  10. 历时数月钻研推流/对比各种流媒体服务程序/PK总结

    1 前言 大量测试下来,网页显示视频流实时性从高到低依次是 webrtc > ws-flv > flv > hls.播放器打开rtsp/rtmp视频流实时性由具体的播放器控制,比如缓 ...