一、缓存穿透

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. mysql函数实现oracle的序列

    1.创建一张伪序列表 CREATE TABLE sequence ( seq_name VARCHAR (50) NOT NULL,-- 序列名称 current_val INT NOT NULL,- ...

  2. C# 日期获得一天的起始时间

    dateTimePicker1.Value = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")); ...

  3. dcat-admin在弹框中使用grid的编辑框不提示也不报错

    显示效果 #版本:2.1.5-beta #点击编辑时没有反应,其实它已经把编辑框显示出来了,只是在当前这个弹框的后面,我们看不见,这样你可以在自己的项目中把弹框挪开或在F12中html搜索应该显示的代 ...

  4. 【QT+MSVC2015】不安装VS2015,QT配置MSVC2015编译环境

    本文介绍不安装VS2015的情况下在QT5.10中配置MSVC2015编译器. 系统:windows系统 QT版本:5.10.1 所需文件: QT安装程序--qt-opensource-windows ...

  5. QT中文显示乱码

    1. 环境:VS2015+QT5.10 解决:在头文件中声明  #pragma  execution_character_set("utf-8") 2. QT5.10中控件显示中文 ...

  6. gulp安装出错

    gulp安装出错 标签(空格分隔): gulp 贴上报错: [root@localhost web]# npm install gulp --save-dev gulptest@1.0.0 /mnt/ ...

  7. JSR303校验

    JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人 ...

  8. 无界面Linux系统和Windows系统使用selenium爬取CNVD数据

    因为CNVD官网采用了反爬机制,所以使用selenium能够更容易的爬取漏洞数据 1.在Windows中使用 注意根据chrome版本下载对应chromedriver 2.在无界面的Linux中使用 ...

  9. 6.mysql优化案例

    1.单表优化:  进行优化: 删除原来的三个字段的索引,创建二个字段的索引: 2.两表关联: 左连接,在右表创建索引   右连接,在左表创建索引: 3.三表关联:左关联全都在右表创建索引:

  10. eclipse设置UTF-8(字符编码集)所有方式

    一.全部方式 1.修改workspace编码 windows->preferences->gengral->workspace 选择other->UTF-8.  2.修改Con ...