通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。

缓存雪崩

如果同一时间大量的缓存数据同时过期(失效)或redis服务宕机,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机。
发生缓存雪崩有两个原因

  • 大量的缓存数据同时过期(失效)
  • redis服务宕机

大量的缓存数据同时过期(失效)的解决方案

1、随机设置过期时间 (TTL)
2、互斥锁

当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到 Redis 里),当缓存构建完成后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

实现互斥锁的时候,最好设置超时时间,不然第一个请求拿到了锁,然后这个请求发生了某种意外而一直阻塞,一直不释放锁,这时其他请求也一直拿不到锁,整个系统就会出现无响应的现象。

3、双 key 策略

我们对缓存数据可以使用两个 key,一个是主 key,会设置过期时间,一个是备 key,不会设置过期,它们只是 key 不一样,但是 value 值是一样的,相当于给缓存数据做了个副本。

当业务线程访问不到「主 key 」的缓存数据时,就直接返回「备 key 」的缓存数据,然后在更新缓存的时候,同时更新「主 key 」和「备 key 」的数据。

4、多级缓存

jvm本地缓存,nginx缓存等

Redis 故障宕机引发的缓存雪崩的解决方案

服务熔断或请求限流机制 (sentinel);
构建 Redis 缓存高可用集群 (主从集群);

缓存击穿

缓存击穿也称(热点key问题),一个被高并发访问缓存业务重建困难的key突然过期(失效)了,于是全部请求都直接访问数据库,从而导致数据库的压力骤增甚至宕机。
如:tb秒杀活动,wb热榜等

解决方案

1、互斥锁


互斥锁保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。最后给锁也添加过期时间

redis命令

SETNX KEY_NAME VALUE

使用setIfAbsent,boot2.1版本以上才支持

stringRedisTemplate.opsForValue().setIfAbsent(key, "1",10, TimeUnit.SECONDS);

使用lua脚本

private Boolean tryGetLock1(String key){/** redisUtil.setIfAbsent 新加的带有超时的setIfAbsent 脚本*///KEYS[1] 用来表示在redis 中用作键值的参数占位,// 主要用來传递在redis 中用作keys值的参数// ARGV[1] 用来表示在redis 中用作参数的占位,// 主要用来传递在redis中用做 value值的参数。String newSetIfAbsentScriptStr = " if 1 == redis.call('setnx',KEYS[1],ARGV[1]) then" +" return 1;" +" else" +" return 0;" +" end;";//创建 redis脚本对象RedisScript<Boolean> newSetIfAbsentScript = new DefaultRedisScript<>(newSetIfAbsentScriptStr,Boolean.class);List<String> keys = new ArrayList<>();keys.add(key);  // keyObject[] values = {"1"};  // value// 执行脚本Boolean res = stringRedisTemplate.execute(newSetIfAbsentScript, keys, values);System.out.println("result:"+res);return res;}

2、逻辑过期


逻辑过期是指不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间

互斥锁和逻辑过期对比

缓存穿透

缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,于是全部请求都直接访问数据库,从而导致数据库的压力骤增甚至宕机。

存在原因:恶意攻击,故意大量访问某些读取不存在数据的业务

解决方案

1、请求校验

2、缓存空对象

3、布隆过滤器

布隆过滤器校验的结果特点是:

  • 若过滤器判断某个元素存在,那么这个元素不一定存在
  • 若过滤器判断某个元素不存在,那么这个元素一定不存在
    布隆过滤器讲解:https://blog.csdn.net/cssweb_sh/article/details/124284785

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

  1. redis缓存雪崩、穿透、击穿概念、布隆过滤器小结及解决办法

    判存业务 redis缓存雪崩.穿透.击穿概念及解决办法 什么是 概念: 1.缓存雪崩 对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意 ...

  2. 小白也能看懂的缓存雪崩、穿透、击穿

    作为后端开发,我想缓存是大家再熟悉不过的东西了. 我会介绍出现缓存雪崩.穿透和击穿的业务背景.解决方案和对业务可靠性处理.事先说明,最佳解决方案一定需要结合实际业务调整,不同业务的处理不完全相同 其实 ...

  3. 【Redis】快速掌握:缓存雪崩、穿透、击穿、预热

    目录 前言 一.缓存 1.1.程序中缓存是什么样的? 1.2.缓存的优点 1.3.缓存的分类 二.缓存特性 2.1.缓存雪崩 2.1.1.雪崩问题 2.1.2.如何解决缓存雪崩问题 2.2.缓存穿透 ...

  4. Redis缓存雪崩、穿透、击穿,布隆过滤器,分布式锁详解

    缓存雪崩 在某一个时间存在大量的缓存key失效 解决办法 1.有效期一直---->给每一个数据加上水机有效期 2.redis挂掉了----->使用redis集群,分摊key的存储 引出re ...

  5. 轻松易懂的缓存雪崩、穿透、击穿以及解决方案

    缓存雪崩 先来看下雪崩的过程 所谓缓存雪崩,指的是缓存数据同一时间大量失效,所有的请求全打到数据库,导致数据库在巨大压力下挂掉. 比如在双十一的时候,用户都会打开淘宝买东西,有的人是真的有需要买的,有 ...

  6. redis的雪崩、穿透、击穿解析

    雪崩 redis中的key在某个时间段内,大量的失效,此时有大量请求查询这些key,那么这些请求就会去到后端数据库查询,后端数据库压力过大导致数据库宕机,最后系统崩溃.(雪崩的时候没有一片雪花是无辜的 ...

  7. redis雪崩、穿透、击穿

    文章目录 前言 缓存雪崩 缓存穿透 缓存击穿 传送门 前言 redis服务雪崩.穿透.击穿 缓存雪崩 缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部进入数据库,过量请求拖垮数据库,使整个服务崩溃 ...

  8. 什么是缓存穿透和缓存雪崩?【缓存问题】【刘新宇】

    缓存问题 1 缓存穿透 缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了.如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间 ...

  9. 面试精讲之面试考点及大厂真题 - 分布式专栏 10 Redis雪崩,穿透,击穿三连问

    10 Redis雪崩,穿透,击穿三连问 能够生存下来的物种,并不是那些最强壮的,也不是那些最聪明的,而是那些对变化作出快速反应的. --达尔文 引言 关于Redis雪崩,穿透,击穿的问题,第一次接触名 ...

  10. Redis面试 - redis 的雪崩和穿透?

    Redis面试 - redis 的雪崩和穿透? 面试题 了解什么是 redis 的雪崩和穿透?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实 ...

最新文章

  1. java事务设计iofo,Spring事务最佳实践
  2. opencv jni Android 实例笔记
  3. inputstream示例_Java InputStream available()方法与示例
  4. JS身份证合法性校验完全版
  5. catia如何整列加工_非标零件如何用机器检测?能像人类一样查出问题吗?
  6. php 处理像素点数组,求助:php处理这个数组
  7. ggplot2作图详解:主题(theme)设置
  8. 【问答】开放领域问答梳理(2)
  9. Jenkins持续集成环境, 如何自定义 maven 仓库
  10. 在鼠标右键菜单栏添加notepad++打开方式
  11. 服务器2003系统序列号,Windows Server 2003 R2 With Sp2 序列号
  12. 公务员从事计算机网络工作,干程序员好,还是从事公务员更有前途?网友:要是我就当公务员!...
  13. 计算机三级数据库要安装什么软件,计算机三级数据库技术题库app
  14. MySQL 数据对比
  15. 微信公众号开发(个人订阅号)
  16. 员工管理系统-SpringBoot+Vue入门小项目实战
  17. 苏宁服务器修复,苏宁服务器崩了?故障尚未完全修复,网友猜测或因顾客抢购...
  18. 【应用】Android平台最佳健身
  19. 写作技巧~100段作文排比句(1-20段),考试一定用得上,赶紧收藏!
  20. python 标准库库

热门文章

  1. ryzen linux mac,AMD Ryzen平台全新的mac10.13.3的简洁安装镜像
  2. Socket编写一个HTTP server程序(源码+运行效果)
  3. Spring Boot学习笔记-Nginx+Jar包部署项目
  4. 查看nginx配置文件路径和资源文件路径
  5. TP5设置请求header信息
  6. linux防火墙放开pptpd端口号,Linux下 iptables防火墙 放开相关端口 拒绝相关端口 及查看已放开端口...
  7. 「工业云平台」企业实现设备互联方案
  8. JavaFX制作水墨大写意画板程序
  9. js+html 象棋游戏 可以简单人机对战
  10. [附源码]SSM计算机毕业设计关爱留守儿童志愿者管理系统PPTJAVA