一、缓存穿透

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. Pytest 插件

    1. 执行标记用例执行次数 首先安装 repeat: pip install pytest-repeat @pytest.mark.repeat(n)执行当前用例 n 次 然后再往下执行其他用例 im ...

  2. ENGG1310 Electricity and electronics P1.2 Electronic Communication

    课程内容笔记,自用,不涉及任何 assignment,exam 答案 Notes for self use, not included any assignments or exams 一个 3h 的 ...

  3. win10上打包的qt程序放到win7上打不开的解决方法

    在win 10 上编写并打包发布了qt5.12.3 msvc2017 32bit的qt程序,在其他win10 电脑上都能正常运行,但是放到win7电脑上,运行exe时依次出现缺少"msvcp ...

  4. Java-封装结果集示例

    1 @Data 2 public class ResultData implements Serializable { 3 4 /** 5 * 状态码 6 */ 7 private String co ...

  5. ue4中动画通知的几种方式

    原创:蝶泳奈何桥 animation blueprint中的几种notify,神马通知碰撞开启关闭的东东都可以使用notify 1.简单的通知(blueprint) 直接在sequence or mo ...

  6. Spyder无法使用搜狗输入中文的解决办法

    Ubuntu 18.04 LTS系统下,spyder4编辑器无法使用搜狗输入中文.系统输入法为fcitx+搜狗拼音,chrome浏览器无此问题.网上答案: Spyder (以及其他PyQt程序) 无法 ...

  7. 【转】【善用佳软】文件复制软件评测:FastCopy、TeraCopy、ExtremeCopy、Supercopier

    文件复制软件评测:FastCopy.TeraCopy.ExtremeCopy.Supercopier 原文:https://xbeta.info/fastcopy-teracopy-extremeco ...

  8. 个人css样式_2: 渐变色

    css的魅惑力 css渐变色用途还是 比较广的. ---------------------------- 效果图: html代码(三个div): <div class="div1&q ...

  9. 杂:pthread_cond_timedwait导致死锁

    地球人都知道1:pthread_cond_timedwait使用时,需要对[条件]加锁.[条件]也是一种线程共享资源. 地球人都知道2:1个互斥锁不应该管理2类及以上的多线程共享资源 1+2=下面这样 ...

  10. Enhancement S_ALR_87011964 Asset Balance Report to add custom column

    Enhancement S_ALR_87011964 Asset Balance Report to add custom column - SAP Tutorial Include own fiel ...