缓存穿透

缓存穿透是指当用户对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. Centos7下创建Oracle用户

    Centos7下创建Oracle用户 Oracle中,一个用户其实就类似于一个数据库,本次就来创建一个新用户 登录 将系统用户切换到oracle用户下 su - oracle -- 启动sqlplus ...

  2. Linux 命令:lsof

    参考文档:lsof命令详解 lsof,列出系统中所有打开的文件. 各列字段意义如下: COMMAND: 进程的名称 PID: 进程标识符 USER: 进程所有者 FD: 文件描述符,应用程序通过文件描 ...

  3. Python 潮流周刊第 13 期(2023-07-29)

    查看全文: https://pythoncat.top/posts/2023-07-29-weekly 文章&教程 1.Jupyter Notebook 7 隆重发布 (英) 2.Python ...

  4. java使用apache.poi导出word文件

    功能说明: 将试卷导出word,并可以打印,装订,效果图: 下面是实现代码: package com.xxxxx.business.course.utils; import com.alibaba.f ...

  5. 青少年CTF平台 Web签到

    题目说明 Web一星简单题,Web签到. 直接启动环境,等待30秒左右访问题目链接. 做题过程 进入后,题目好像没有告诉我们什么有用的信息, F12,看遍了题目源码,也没有发现flag,正当我怀疑这个 ...

  6. js高级之内存管理与闭包

    javacript中的内存管理 javascript中不需要我们手动去分配内存,当我们创建变量的时候,会自动给我们分配内存. 创建基本数据类型时,会在栈内存中开辟空间存放变量 创建引用数据类型时,会在 ...

  7. 基于C#的无边框窗体阴影绘制方案 - 开源研究系列文章

    今天介绍无边框窗体阴影绘制的内容. 上次有介绍使用双窗体的方法来显示阴影,这次介绍使用API函数来进行绘制.这里使用的是Windows API函数,操作系统的窗体也是用的这个来进行的绘制. 1. 项目 ...

  8. 无界AI绘画基础教程,和Midjourney以及Stable Diffusion哪个更好用?

    本教程收集于:AIGC从入门到精通教程汇总 简单的总结 Midjourney,Stable Diffusion,无界AI的区别? Midjourney,收费,上手容易,做出来高精度的图需要自己掌握好咒 ...

  9. 小白整理了VUEX

    在小白开发的项目中前端使用的是Vue,虽然在日常工作中可以使用Vue进行开发工作.但是没有系统的学习过Vue,对Vue的一些特性和方法使用时常常需要查询资料解决问题,查询资料常常会占用大量时间,尤其对 ...

  10. 浅谈API安全的应用

    ​ 理论基础 API它的全称是Application Programming Interface,也叫做应用程序接口,它定义了软件之间的数据交互方式.功能类型.随着互联网的普及和发展,API 从早期的 ...