Redis中的缓存雪崩、缓存击穿、缓存穿透问题
1. 什么是缓存雪崩
当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系统可能会崩溃。
1.1 缓存雪崩的成因
- 大量缓存同时设置相同的过期时间:如果在某一时刻设置了大量的缓存数据,并为它们都设置了相同的过期时间,那么在未来的某一时刻,这些缓存数据都会同时失效。
- Redis宕机:如果因为某种原因,Redis服务器突然宕机,那么所有的缓存数据都会消失,导致所有的请求都直接访问数据库。
- 误删缓存数据:如果由于某种原因,大量的缓存数据被误删除,那么也会引发缓存雪崩。
1.2 如何预防缓存雪崩
- 设置随机过期时间:为了防止大量的缓存同时失效,我们可以为每个缓存设置一个随机的过期时间,这样就可以确保不会有太多的缓存同时失效。
- 使用熔断机制:在系统中加入熔断机制,当数据库请求到达一定的阈值时,直接拒绝部分请求,以保护数据库不被过度访问。
- 双层缓存策略:可以使用两层缓存,一层是热数据的缓存,另一层是冷数据的缓存。热数据缓存失效后,可以先访问冷数据缓存,而不是直接访问数据库。
- 数据预热:在系统启动后,预先加载部分常用的数据到缓存中,减少在高峰期的数据库访问。
- 使用高可用架构:如使用Redis的哨兵模式或者集群模式,确保Redis服务的高可用。
- 备份和恢复策略:定期备份Redis数据,并确保在Redis宕机后,可以快速恢复数据。
2. 什么是缓存穿透?
在使用缓存的应用程序中,缓存穿透是一种指请求查询一个不存在的数据,由于缓存层不存在这个数据,所以请求会穿过缓存层直接查询数据库,导致数据库压力增加。缓存穿透通常发生在恶意攻击或者系统设计不当的情况下。
2.1 导致缓存穿透的原因
- 恶意攻击:攻击者有意请求不存在的数据,以使得系统频繁访问数据库,造成拒绝服务攻击。
- 大量请求:如果一个不存在的热点数据被大量请求,会导致这些请求穿透缓存层直接访问数据库,增加数据库压力。
- 缓存数据失效不及时:当缓存中的数据未及时更新或失效,而恰好有大量请求访问这部分失效的数据时,也会导致缓存穿透问题。
2.2 缓解缓存穿透的方法
- 布隆过滤器:在缓存层前使用布隆过滤器,对所有可能的数据建立一个布隆过滤器,用于快速判断一个请求的数据是否存在于数据库中。
- 空结果缓存:对于数据库中不存在的数据,也将其缓存起来,但设置一个较短的过期时间,避免大量的无效请求直接访问数据库。
- 合理设置缓存时间:根据业务场景,合理设置缓存时间,避免缓存数据过早失效导致大量请求穿透。
3. 什么是缓存击穿?
缓存击穿是指在高并发环境下,大量请求同时访问缓存中不存在的数据,导致这些请求穿透到数据库。这会对数据库造成严重的压力,降低性能。
3.1 缓存穿透与缓存击穿的区别
- 缓存穿透 是指请求一个不存在于缓存中的数据,导致每次请求都直接查询数据库。
- 缓存击穿 是指大量请求同时请求一个不存在于缓存中的数据,导致数据库压力骤增。
3.2 缓存击穿的原因
缓存击穿通常发生在以下情况下:
- 热点数据:某个数据非常热门,但缓存中没有。
- 缓存失效:缓存中的数据过期,但大量请求仍在访问。
- 同时到期:多个数据同时过期,导致并发查询数据库。
3.3. 解决缓存击穿问题
- 使用互斥锁: 通过在缓存中设置互斥锁,只允许一个线程查询数据库,其他线程等待结果。这可以防止多个请求同时穿透到数据库。
- 预加载数据: 在缓存中设置数据预加载,避免等待请求引发缓存击穿。这需要定期刷新缓存,确保热门数据始终可用。
- 布隆过滤器: 使用布隆过滤器检查请求的数据是否存在于缓存中,如果不存在,不查询数据库。这可以减少数据库查询次数。
- 优化数据库查询: 优化数据库查询性能,减少查询时间,可以降低缓存击穿的风险。使用合适的索引和查询优化策略。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
Redis中的缓存雪崩、缓存击穿、缓存穿透问题的更多相关文章
- 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透
前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...
- Redis缓存雪崩、击穿、穿透
参考大佬 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允 ...
- Redis系列三 - 缓存雪崩、击穿、穿透
前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...
- 第三节:Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案
一. 缓存雪崩 1. 含义 同一时刻,大量的缓存同时过期失效. 2. 产生原因和后果 (1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间. (2). 产生后果:恰逢秒杀高峰, ...
- Redis缓存雪崩,击穿和穿透
这三个问题的发生,会导致大量的请求直接积压到数据库,如果并发量很大,则可能会导致数据库宕机或故障. 缓存雪崩 描述:大量的请求无法在redis缓存中进行处理而被发送到数据库,导致数据库压力陡增. ...
- redis详解及应用(雪崩、击穿、穿透)
一. redis的简介与安装 引用:https://www.cnblogs.com/ysocean/tag/Redis%E8%AF%A6%E8%A7%A3/ 二. redis的配置文件介绍 引用:ht ...
- NoSQL:Redis缓存、雪崩、击穿、穿透
Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...
- MC的缓存雪崩现象和缓存无底洞的原因以及导致的后果的总结
缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降,缓存中确实的数据去数据库查询,短时间内,造成数据库服务器的崩溃. 这时,我们需要重启数据库,但重启一段时间后,又会被压垮,但此时缓存的数 ...
- redis雪崩,击穿,穿透
redis穿透 什么是redis穿透? 1.查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存 2.这将导致这个不存在的数据每次请求都要到存储层 ...
- Redis 面试常见问题———缓存雪崩、缓存击穿以及缓存穿透
在开发中会面临缓存异常可能会出现三个问题,分别是缓存雪崩.缓存击穿和缓存穿透.这三个问题会导致大量请求从缓存转移到数据库,如果请求的并发量很大的话,就会导致数据库崩溃.所以在面试官也会经常问这些问题. ...
随机推荐
- AntdPro中formItemProps和fieldProps的区别
最近在工作中接触到了 antd 和 antd pro,作为一个 react 和 antd 新人,在学习和使用中遇到了不少的问题,下边就常见的一个问题来进行记录,后续还会记录更多的问题以及心得 Form ...
- 【Docker】部署Tomcat
搜索镜像 $ docker search 镜像名称:镜像TAG # 如: 没有加TAG,表示默认搜索的是最新版本的tomcat镜像 $ docker search tomcat # 如:搜索 tomc ...
- 二、GCC编译器工作过程
从更直观的角度来说,编译器是一种工具,将高级语言转化为机器语言.举个例子,我们可以使用编译器将用C++语言编写的程序转换为机器可执行的指令和数据.之前提到过,用机器指令或汇编语言编写程序非常繁琐和乏味 ...
- 2023年郑州轻工业大学校赛邀请赛yy
这也是第一次参加几个人以组队的形式来进行答题.评比,而且这是一场线下赛,收获更是很多.题目一共有十二道,一共五个小时,我们上来也是没有头绪先做哪个,可能三个人的思路不太一样,我们最终先写了第一题,写出 ...
- 如何使用CCXT交易数字货币现货
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 数字货币现货标准化接口 数字货币市场与股票.期货市场最大的不同点在于数字货币主流交易所数量很多.举个例子 ...
- PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法
一:背景 1. 讲故事 在 dump 分析旅程中,经常会遇到很多朋友反馈一类问题,比如: 方法平时都执行的特别快,但有时候会特别慢,怎么排查? 我的方法第一次执行特别慢,能看到慢在哪里吗? 相信有朋友 ...
- Django: ERRORS: ?: (staticfiles.E001) The STATICFILES_DIRS setting is not a tuple or list. HINT: Perhaps you forgot a trailing comma?
必须是数组或者列表类型 如下所示: # 错误# STATICFILES_DIRS = { # os.path.join(BASE_DIR, 'static'), # }# 正确 STATICFILES ...
- 一条命令突破Windows限制,暂定更新时间至3000天
在系统界面上最长也就只能延期 35 天,而且 35 天以后一定要更新了才能继续暂停.不过,我找到了一段能延长暂停时间的代码 reg add "HKEY_LOCAL_MACHINE\SOFTW ...
- cesium 绑定dom弹窗(跟随模型)
https://blog.csdn.net/qq_36266612/article/details/109648367?utm_term=cesium%E6%80%8E%E4%B9%88%E6%B7% ...
- 【教程】AWD中如何通过Python批量快速管理服务器?
前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制.在这种赛制下,我们战队会拿到一个或多个服务器.服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有多个服务 ...