一、缓存穿透

1 什么是缓存穿透

缓存穿透是指查询一个在redis和DB中都不存在的数据,redis中查不到去DB查,DB查不到则不写入redis,导致每次查询这个数据都要穿过redis穿透到DB

2 缓存穿透产生的情况

1) 业务不合理的设计

2) 误操作: 误删除了redis和DB中的数据

3) 黑客非法请求攻击: 故意捏造大量非法请求读取不存在的业务数据

3 解决措施

缓存穿透是不可能自动恢复的

1) 设置空值或默认值

查询DB为空,可以给缓存设置个空值或者默认值写入redis,同时设置一个过期时间

2) 布隆过滤器

a) 将数据库所有的数据加载到布隆过滤器

b) 当有请求时先去布隆过滤器查询,判断查询的数据是否存在

c) 如果判断数据不存在,那么直接返回空给客户端

d) 如果判断数据存在,那么则查询缓存或DB

e) 将DB中查询的结果返回给客户端,并且缓存到 Redis 中

二、缓存击穿

1 什么是缓存击穿

缓存击穿是指热点key在过期失效的瞬间,大量请求穿过了redis直接访问DB

严重的情况甚至会造成DB服务宕机

2 解决措施

1) 热点数据永不过期

2) 加锁

保证每个热点key同时只有一个线程去查询,其它线程会被阻塞,等锁释放开,缓存已有了数据,其它线程就不必访问DB,这会影响服务的高并发量

三、缓存雪崩

1 什么是缓存雪崩

缓存雪崩是指redis中大量key过期或者redis宕机,导致请求直接访问DB,引起DB压力过大甚至宕机

2 解决措施

1) 随机分散过期时间

2) 限流降级: 缓存失效后,通过加锁或队列来控制读取DB且写入redis的线程数量

3) 熔断:暂停缓存访问待实例恢复,返回预定义信息(错误页面或空值等信息)

4) 配置 redis 高可用集群

四、三个缓存问题之间的区别

缓存击穿是热点key过期失效的瞬间,有大量的请求穿过了redis直接访问DB

缓存穿透是请求查询不存在key,穿过了redis直接访问DB

缓存雪崩是大量key同一时间过期或者redis宕机,请求穿过了redis请求直接访问DB

缓存击穿、缓存雪崩都是DB中有数据,但redis中没有,是可以自动恢复的;缓存穿透是redis和DB都没有数据,不可能自动恢复的

redis之缓存穿透、缓存击穿、缓存雪崩的更多相关文章

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

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

  2. redis的缓存穿透、击穿、雪崩以及实用解决方案

    今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣, ...

  3. Redis高级应用解析:缓存穿透、击穿、雪崩

    1 背景 像我们去面试一些大公司的时候,就会遇到一些关于缓存的问题.可能很多同学都是接触过,多多少少了解一些,但是如果没有好好记录这些内容,不熟练精通的话,在真正面试的时候,就很难答出来了. 在我们的 ...

  4. redis 缓存穿透、击穿、雪崩

    缓存穿透: 大量查询 redis 中不存在的key(用随救数进行查询),导致每次都会去查询数据库,造成数据库压力过大(甚至宕机). 解决办法: 1.对我们的 api 接口 进行限流处理.用户授权.黑名 ...

  5. Redis缓存穿透、击穿、雪崩,数据库与缓存一致性

    Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...

  6. 穿透、击穿、雪崩…Redis这么多问题,如何解决?

    摘要:什么是缓存穿透?什么是缓存击穿,又什么是缓存雪崩呢?它们是如何造成的?又该如何解决呢?今天,我们就一起来探讨这些问题. 本文分享自华为云社区<[高并发]什么是缓存穿透?击穿?雪崩?如何解决 ...

  7. Redsi缓存问题(穿透,击穿,雪崩)以及解决办法(分布式锁)【高并发问题】

    Redsi常见问题 缓存在高平发和安全压力下的一些问题 缓存击穿 是某一个热点key在高并发访问的情况下,突然失效,导致大量的并发大金mysql数据库的情况 缓存穿透 是利用redis和mysql的机 ...

  8. 【Redis场景3】缓存穿透、击穿问题

    场景问题及原因 缓存穿透: 原因:客户端请求的数据在缓存和数据库中不存在,这样缓存永远不会生效,请求全部打入数据库,造成数据库连接异常. 解决思路: 缓存空对象 对于不存在的数据也在Redis建立缓存 ...

  9. NoSQL & Redis 介绍、缓存穿透 & 击穿 & 雪崩

    1. NoSql 简介 2. Redis 简介 2.1 Redis 的起源 2.2 缓存过期 & 缓存淘汰 3. 缓存异常 1)缓存穿透 2)缓存击穿 3)缓存雪崩 4)总结 1. NoSQL ...

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

    在实际项目中,MySQL数据库服务器有时会位于另外一台主机,需要通过网络来访问数据库:即使应用程序与MySQL数据库在同一个主机中,访问MySQL也涉及到磁盘IO操作(MySQL也有一些数据预读技术, ...

随机推荐

  1. Workbench download Document

    1. package.xml <?xml version="1.0" encoding="UTF-8"?> <Package xmlns=&q ...

  2. java ArrayList 原理

    概述 底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 Vector 大致相同 自动扩容,每次扩容大概 1.5 倍,扩容代价比较高尽量避免 实现了 RandomAcc ...

  3. 前端实现电子签名(web、移动端)通用组件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. [记] OpenCV4 源码编译安装 | 记录

    OpenCV4 源码编译安装 | 记录 参考资料 官方文档:https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html 环境 wsl2 ...

  5. Java程序(数组扩容的尝试)

    import java.util.Scanner; public class ArrayAdd { public static void main(String[] args) { int arr[] ...

  6. Neuropsychological Assessment 5th

    书本详情 Neuropsychological Assessment作者: Muriel Deutsch Lezak / Diane B. Howieson / Erin D. Bigler / Da ...

  7. Ubuntu截图软件

    Ubuntu截图软件 方法一:使用系统自带的快捷键 可以将其修改为自己习惯的快捷键 如图: 方式二:使用软件ksnip GitHub: https://github.com/ksnip/ksnip 安 ...

  8. JAVA集合框架特征介绍

    数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架.在平常的学习开发中,灵 ...

  9. (一)用go实现单链表

    本篇,我们用go简单的实现单链表这种数据结构. 1.节点定义 type Node struct{ data int next *Node } 2.节点的添加 // 尾插法插入节点 func (p *N ...

  10. 性能测试-IO密集型-直接会话可能会断了,命令执行不了

    1.IO密集型模拟命令 该命令会开启1个worker不停的读写临时文件,同时启动6个workers不停的调用sync系统调用提交缓存 stress-ng -i 6 --hdd 1 --timeout ...