redis——缓存雪崩、缓存穿透、缓存击穿
通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 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——缓存雪崩、缓存穿透、缓存击穿相关推荐
- redis缓存雪崩、穿透、击穿概念、布隆过滤器小结及解决办法
判存业务 redis缓存雪崩.穿透.击穿概念及解决办法 什么是 概念: 1.缓存雪崩 对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意 ...
- 小白也能看懂的缓存雪崩、穿透、击穿
作为后端开发,我想缓存是大家再熟悉不过的东西了. 我会介绍出现缓存雪崩.穿透和击穿的业务背景.解决方案和对业务可靠性处理.事先说明,最佳解决方案一定需要结合实际业务调整,不同业务的处理不完全相同 其实 ...
- 【Redis】快速掌握:缓存雪崩、穿透、击穿、预热
目录 前言 一.缓存 1.1.程序中缓存是什么样的? 1.2.缓存的优点 1.3.缓存的分类 二.缓存特性 2.1.缓存雪崩 2.1.1.雪崩问题 2.1.2.如何解决缓存雪崩问题 2.2.缓存穿透 ...
- Redis缓存雪崩、穿透、击穿,布隆过滤器,分布式锁详解
缓存雪崩 在某一个时间存在大量的缓存key失效 解决办法 1.有效期一直---->给每一个数据加上水机有效期 2.redis挂掉了----->使用redis集群,分摊key的存储 引出re ...
- 轻松易懂的缓存雪崩、穿透、击穿以及解决方案
缓存雪崩 先来看下雪崩的过程 所谓缓存雪崩,指的是缓存数据同一时间大量失效,所有的请求全打到数据库,导致数据库在巨大压力下挂掉. 比如在双十一的时候,用户都会打开淘宝买东西,有的人是真的有需要买的,有 ...
- redis的雪崩、穿透、击穿解析
雪崩 redis中的key在某个时间段内,大量的失效,此时有大量请求查询这些key,那么这些请求就会去到后端数据库查询,后端数据库压力过大导致数据库宕机,最后系统崩溃.(雪崩的时候没有一片雪花是无辜的 ...
- redis雪崩、穿透、击穿
文章目录 前言 缓存雪崩 缓存穿透 缓存击穿 传送门 前言 redis服务雪崩.穿透.击穿 缓存雪崩 缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部进入数据库,过量请求拖垮数据库,使整个服务崩溃 ...
- 什么是缓存穿透和缓存雪崩?【缓存问题】【刘新宇】
缓存问题 1 缓存穿透 缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了.如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 10 Redis雪崩,穿透,击穿三连问
10 Redis雪崩,穿透,击穿三连问 能够生存下来的物种,并不是那些最强壮的,也不是那些最聪明的,而是那些对变化作出快速反应的. --达尔文 引言 关于Redis雪崩,穿透,击穿的问题,第一次接触名 ...
- Redis面试 - redis 的雪崩和穿透?
Redis面试 - redis 的雪崩和穿透? 面试题 了解什么是 redis 的雪崩和穿透?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实 ...
最新文章
- java事务设计iofo,Spring事务最佳实践
- opencv jni Android 实例笔记
- inputstream示例_Java InputStream available()方法与示例
- JS身份证合法性校验完全版
- catia如何整列加工_非标零件如何用机器检测?能像人类一样查出问题吗?
- php 处理像素点数组,求助:php处理这个数组
- ggplot2作图详解:主题(theme)设置
- 【问答】开放领域问答梳理(2)
- Jenkins持续集成环境, 如何自定义 maven 仓库
- 在鼠标右键菜单栏添加notepad++打开方式
- 服务器2003系统序列号,Windows Server 2003 R2 With Sp2 序列号
- 公务员从事计算机网络工作,干程序员好,还是从事公务员更有前途?网友:要是我就当公务员!...
- 计算机三级数据库要安装什么软件,计算机三级数据库技术题库app
- MySQL 数据对比
- 微信公众号开发(个人订阅号)
- 员工管理系统-SpringBoot+Vue入门小项目实战
- 苏宁服务器修复,苏宁服务器崩了?故障尚未完全修复,网友猜测或因顾客抢购...
- 【应用】Android平台最佳健身
- 写作技巧~100段作文排比句(1-20段),考试一定用得上,赶紧收藏!
- python 标准库库
热门文章
- ryzen linux mac,AMD Ryzen平台全新的mac10.13.3的简洁安装镜像
- Socket编写一个HTTP server程序(源码+运行效果)
- Spring Boot学习笔记-Nginx+Jar包部署项目
- 查看nginx配置文件路径和资源文件路径
- TP5设置请求header信息
- linux防火墙放开pptpd端口号,Linux下 iptables防火墙 放开相关端口 拒绝相关端口 及查看已放开端口...
- 「工业云平台」企业实现设备互联方案
- JavaFX制作水墨大写意画板程序
- js+html 象棋游戏 可以简单人机对战
- [附源码]SSM计算机毕业设计关爱留守儿童志愿者管理系统PPTJAVA