目录

缓存穿透

发生场景

解决方案

缓存雪崩

发生场景

解决方案

缓存击穿

解决方案


缓存穿透

缓存穿透(cache penetration)是用户访问的数据既不在缓存当中,也不在数据库中。出于容错的考虑,如果从底层数据库查询不到数据,则不写入缓存。这就导致每次请求都会到底层数据库进行查询,缓存也失去了意义。当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤增,甚至崩溃,这就是缓存穿透问题。

发生场景

1、原来数据是存在的,但由于某些原因(误删除、主动清理等)在缓存和数据库层面被删除了,但前端或前置的应用程序依旧保有这些数据

2、恶意攻击行为,利用不存在的Key或者恶意尝试导致产生大量不存在的业务数据请求

解决方案

  • 缓存空值(null)或默认值

分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。需要注意的是,针对空值的缓存失效时间不宜过长,一般设置为5分钟之内。当数据库被写入或更新该key的新数据时,缓存必须同时被刷新,避免数据不一致。

优点:实现简单,维护方便

缺点:额外的内存消耗,因为缓存了一些瞎编的id对应的空对象,但是可以通过给对象设置TTL解决,但是会造成短期的数据不一致

  • 添加业务逻辑校验

检查请求参数是否合理、是否包含非法值、是否恶意请求等,提前有效阻断非法请求

  • 使用布隆过滤器

在写入数据时,使用布隆过滤器进行标记(相当于设置白名单),业务请求发现缓存中无对应数据时,可先通过查询布隆过滤器判断数据是否在白名单内,如果不在白名单内,则直接返回空或失败

优点:内存占用少

缺点:实现复杂,存在误判

  • 定制黑名单

当发生异常情况时,实时监控访问的对象和数据,分析用户行为,针对故意请求、爬虫或攻击者,进行特定用户的限制
可以考虑使用bitmaps类型定义

缓存雪崩

在使用缓存时,通常会对缓存设置过期时间,一方面目的是保持缓存与数据库数据的一致性,另一方面是减少冷缓存占用过多的内存空间
但当缓存中大量热点缓存采用了相同的实效时间,就会导致缓存在某一个时刻同时实效,请求全部转发到数据库,从而导致数据库压力骤增,甚至宕机。从而形成一系列的连锁反应,造成系统崩溃等情况,这就是缓存雪崩(Cache Avalanche)

发生场景

  • 大量热点key同时过期
  • 缓存服务故障

解决方案

  • key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的失效
  • 用队列或者锁的方式,保证缓存单线程写,但这种方案可能会影响并发量
  • 热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景
  • 双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值
  • 构建缓存高可用集群(针对缓存服务故障情况)
  • 当缓存雪崩发生时,服务熔断、限流、降级等措施保障

缓存击穿

缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。这种情况就是缓存击穿(Cache Breakdown)。

解决方案

  • 使用互斥锁(Mutex Key),只让一个线程构建缓存,其他线程等待构建缓存执行完毕,重新从缓存中获取数据。单机通过synchronized或lock来处理,分布式环境采用分布式锁。
  • 热点数据不设置过期时间,后台异步更新缓存,适用于不严格要求缓存一致性的场景。
  • ”提前“使用互斥锁(Mutex Key):在value内部设置一个比缓存(Redis)过期时间短的过期时间标识,当异步线程发现该值快过期时,马上延长内置的这个时间,并重新从数据库加载数据,设置到缓存中去
  • 二级缓存:对于热点数据进行二级缓存,并对于不同级别的缓存设定不同的失效时间

缓存穿透、缓存雪崩、缓存击穿相关推荐

  1. Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

    一.概述 ① 缓存穿透:大量请求根本不存在的key(下文详解) ② 缓存雪崩:redis中大量key集体过期(下文详解) ③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热 ...

  2. 什么是缓存穿透、雪崩、击穿以及解决方案

    目录 1.缓存穿透 2.缓存雪崩 3.缓存击穿 4.区别总结 5.加锁实现 1.缓存穿透 描述: 在查询一个数据时,在缓存中不存在,将去数据库进行查询并且数据库中也不存在数据,使得缓存中一直不会存在数 ...

  3. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?

    对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣 ​ ​ redis缓存穿透 ​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据 ...

  4. 缓存穿透、雪崩、击穿的区分

    缓存穿透: 是指用户查询一个不存在的数据,由于缓存无法命中,将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去 ...

  5. 一篇吃透Redis缓存穿透、雪崩、击穿问题

    前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:"如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机" ...

  6. Redis11_缓存穿透和雪崩

    Redis11_缓存穿透和雪崩 缓存穿透 用户查询某个数据时,会先在redis缓存中查询,如果缓存没有命中,会去持久层数据库MySQL中查询,如果此时依然没有命中,将返回null,不会写入缓存. 当同 ...

  7. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)

    Redis NoSql简述 Nosql概念 Nosql的四大分类 Redis概述 Redis的安装 安装文件 Window下安装 Linux下安装 redis-benchmark 压力测试工具 五大数 ...

  8. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  9. 常说的「缓存穿透」和「击穿」是什么

    作者 | 鄙人薛某  责编 | 张文 头图 | CSDN 下载自视觉中国 来源 | 鄙人薛某(ID:gh_4c2f29048530) 对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是 ...

  10. 21_Redis_浅析Redis缓存穿透和雪崩

    为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...

最新文章

  1. 手机支架3d打印模型_3D打印工艺模型制造
  2. vb.net 线程偶尔不会自动关闭_C# 多线程系列(7)手动线程通知
  3. winner or loser
  4. Asp.net中基于Forms验证的角色验证授权[转]
  5. 用C语言实现linux的ping,用C语言实现Ping程序功能
  6. 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
  7. 如何调整SAP HANA studio里的字体大小
  8. 计算机动画原理课程设计,Flash动画优化的原理和常用优化方式,毕业论文,课程设计,PPT,开发报告,外文翻译 - 论文助手...
  9. opendrive中的几何形状
  10. ps中怎么导出tif_TIF图片太大难以上传?
  11. 微信小程序 上传身份证图像限制
  12. JavaFx之横向布局左右两侧对齐(十九)
  13. kingbase之ksql命令工具
  14. 了解Wi-fi频段概念
  15. 如何将mp4视频压缩变小,视频压缩快速完成
  16. python中如何打开文件选择框
  17. XTF文件的数据结构解析完成
  18. 00后步入社会,有哪些适合你的创业项目?
  19. Java编程基础-方法
  20. 软件测试技能图谱|自学测试路线图

热门文章

  1. Introduce·艺术类学科核心期刊推荐之《中国文艺评论》
  2. 基于matlab的蓝色车牌识别(绪论)
  3. 触摸键盘失灵 鼠标指针不出现如何解决
  4. IgH详解十一、IgH(FSM)有限状态机
  5. 简历投递最佳时间点公布
  6. “入微”背后,微信想做的是新时代“超级门户”
  7. EPPlusHelper
  8. CRMEB多商户商城系统总后台目录结构说明
  9. 适合做python开发的笔记本,python编程用什么笔记本
  10. 学java对笔记本配置有何要求_java程序员应该配置什么样的笔记本