一、缓存穿透

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. 图片上传 加水印 以及GDI基本画图

      上传图片并给所上传的图片添加水印 1 HttpPostedFile file = Context.Request.Files[0]; //有这个0说明一次只能上传一张 2 if (file.Con ...

  2. “const char*“类型的实参与“LPCWSTR-类型的形参不兼容

    const char *类型的实参与LPCWSTR类型的形参不兼容解决 LPCWSTR类型是是一个指向unicode编码字符串的32位指针,所指向字符串是wchar型(4字节,Unicode编码宽字节 ...

  3. Docker部署netdata 性能实时监控

    netdata 是常用的Linux系统性能实时监控面板 netdata 官方文档 https://learn.netdata.cloud/ 1.Docker 镜像下载地址 https://hub.do ...

  4. HIVE-文字提取

    regexp_extract(filed,('aaa|bbb|ccc|ddd'),0) 从字段filed中提取含有aaa或bbb或ccc或ddd的string信息

  5. 1. ansible学习总结: 基础模块

    copy模块: #传输文件到目标机 ansible -i /kingdee/ansible/host all -m copy -a 'src=/tmp/aaaa.tgz dest=/tmp/aaaa. ...

  6. 5. nginx跨域配置

    1.跨域问题处理:在nginx相关接口上配置如下: 如接口有自己的请求头,则加上:如接口自带请求头pubacc-buid if ($request_method = "OPTIONS&quo ...

  7. css animation 复刻

    今天做了一个七巧板的小页面,发现对于css动画一些内容又有了新的认识,所以以下准备复习一遍 首先一共有以下属性 @keyframes 如果您在 @keyframes 规则中指定了 CSS 样式,动画将 ...

  8. SQL数学函数学习

    笔记来自如鹏网杨中科老师所著的 <程序员的SQL金典>#创建数据库表 CREATE Table T_Person ( FIdNumber VARCHAR(20), FName varcha ...

  9. 【BOOK】数据存储--MongoDB

    MongoDB存储 1.链接MongoDB        指定数据库        指定集合 import pymongo ## 连接数据库 client = pymongo.MongoClient( ...

  10. KingbaseES V8R3集群运维案例之---cluster.log ERROR: md5 authentication failed

    案例说明: 在KingbaseES V8R3集群的cluster.log日志中,经常会出现"ERROR: md5 authentication failed:DETAIL: password ...