Redis面试必问题(一)缓存穿透、缓存击穿、缓存雪崩
一、缓存穿透(数据库没有,缓存没有)
1、概念
当查询Redis中没有数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当出现大量这种查询(或被恶意攻击)时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据,我们称这种现象为“缓存穿透”。
缓存穿透会穿透Redis的保护,让底层数据库的负载压力变大,同时这类穿透查询没有数据返回也造成了网络和计算资源的浪费。
2、解决方案
- 在业务服务访问层对请求进行校验,比如:请求参数、登录状态、N秒内访问接口的次数、随机数、时间戳等。判断是不是来自恶意用户的请求,可避免进一步访问缓存和数据库。
- 对于查询为空的数据,可以将这个空结果(或者设置一个默认值)进行Redis缓存(将key-value对写为key-null或者key-default),这样后续请求就可以从缓存中读取到空值或者默认值返回给应用,而不会继续查询数据库。但是需设置很短的过期时间,比如30s(设置太长可能会导致正常情况也无法使用),也可根据实际业务需求设定。注意一定不要影响正常的业务。
- 利用布隆过滤器将数据库层有关数据的键存储到布隆过滤器中,以判断访问的键是否在底层的数据库中。如果在布隆过滤器中则查询缓存,如果缓存没有则再次查询数据库;如果布隆过滤器中没有,则直接返回预先规定的结果即可。
因为哈希冲突的存在,布隆过滤器有误判率,查询布隆过滤器说数据存在,并不一定证明数据库中存在这个数据,但是查询到数据不存在,数据库中一定就不存在这个数据。
虽然布隆过滤器不能完全避免数据穿透的现象,但已经可以将99.99%的穿透查询屏蔽在Redis层,极大的降低了底层数据库的压力,减少了资源浪费。
二、缓存击穿(数据库有,缓存没有)
1、概念
当某个热点数据(被频繁访问的数据)的键从缓存中淘汰出去后,大量访问同时请求这个数据就会将查询下沉到数据库层,此时数据库层的负载压力增大,我们称这种现象为“缓存击穿”。
2、解决方案
- 不给热点数据设置过期时间,由后台异步更新缓存。或者在热点数据准备要过期前,提前通知后台线程(或者是定时任务)去更新缓存以及重新设置过期时间。
- 利用互斥锁保证同一时刻只有一个客户端可以查询底层数据库的数据。在根据key获取value值为空时,先锁上,然后从数据库加载,一旦查到数据就缓存至Redis内,然后释放锁。若其他线程也在请求该key时发现获取锁失败,则休眠一段时间(比如100ms)后再重试,以避免其他大量请求同时穿过Redis去访问底层数据库。
三、缓存雪崩
1、概念
Redis中大量的键几乎同时过期或者Redis发生故障宕机,大量并发的查询穿过Redis冲击到底层数据库上,此时数据库层的负载压力会增大,我们称这种现象为“缓存雪崩”。
2、解决方案
- 在可接受的时间范围内随机设置键的过期时间,分散键的过期时间,以防止大量的键在同一时刻过期
- 使用多级缓存机制
- 对于一定要在固定时间让key失效的场景(例如每日12点准时更新所有最新排名),可以在固定的失效时间时在接口服务端设置随机延时,将请求的时间打散,让一部分查询先将数据缓存起来;
-------------------------------本篇文章到此结束-------------------------------------
Redis面试必问题(一)缓存穿透、缓存击穿、缓存雪崩的更多相关文章
- 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩
前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...
- redis的缓存穿透、击穿、雪崩以及实用解决方案
今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣, ...
- Redis高级应用解析:缓存穿透、击穿、雪崩
1 背景 像我们去面试一些大公司的时候,就会遇到一些关于缓存的问题.可能很多同学都是接触过,多多少少了解一些,但是如果没有好好记录这些内容,不熟练精通的话,在真正面试的时候,就很难答出来了. 在我们的 ...
- redis 缓存穿透、击穿、雪崩
缓存穿透: 大量查询 redis 中不存在的key(用随救数进行查询),导致每次都会去查询数据库,造成数据库压力过大(甚至宕机). 解决办法: 1.对我们的 api 接口 进行限流处理.用户授权.黑名 ...
- Redis缓存穿透、击穿、雪崩,数据库与缓存一致性
Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...
- 穿透、击穿、雪崩…Redis这么多问题,如何解决?
摘要:什么是缓存穿透?什么是缓存击穿,又什么是缓存雪崩呢?它们是如何造成的?又该如何解决呢?今天,我们就一起来探讨这些问题. 本文分享自华为云社区<[高并发]什么是缓存穿透?击穿?雪崩?如何解决 ...
- 【Redis场景3】缓存穿透、击穿问题
场景问题及原因 缓存穿透: 原因:客户端请求的数据在缓存和数据库中不存在,这样缓存永远不会生效,请求全部打入数据库,造成数据库连接异常. 解决思路: 缓存空对象 对于不存在的数据也在Redis建立缓存 ...
- redis面试必问
1.项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试题剖析 为什么要用缓存? 用缓存,主要有两个用途:高性能.高并发. 高性能 假设这么个场景,你有个操作,一个请求过来,吭哧 ...
- Redsi缓存问题(穿透,击穿,雪崩)以及解决办法(分布式锁)【高并发问题】
Redsi常见问题 缓存在高平发和安全压力下的一些问题 缓存击穿 是某一个热点key在高并发访问的情况下,突然失效,导致大量的并发大金mysql数据库的情况 缓存穿透 是利用redis和mysql的机 ...
- NoSQL & Redis 介绍、缓存穿透 & 击穿 & 雪崩
1. NoSql 简介 2. Redis 简介 2.1 Redis 的起源 2.2 缓存过期 & 缓存淘汰 3. 缓存异常 1)缓存穿透 2)缓存击穿 3)缓存雪崩 4)总结 1. NoSQL ...
随机推荐
- 显式等待(一)WebDriverWait类、until()方法
转自: https://blog.csdn.net/zyooooxie/article/details/84422924
- 上传路径Class替换无效
路径配置文件使用的常量,其它文件使用路径时,编译class时为静态常量信息,改变不同的路径常量则不生效
- Debug --> CICFlowMeter的java版本安装及使用
一. 首先,给出一个很详细的配置链接!使用IDEA进行配置~ https://blog.csdn.net/BananaMan45/article/details/105473151?utm_mediu ...
- 【Delphi11】「Embarcadero.Delphi.11.0.v28.0.42600.6491.Lite.v17.0分享」
[Delphi11]转存或下载后将后缀名".exe"删除即可,或者直接右击解压缩也可.「Embarcadero.Delphi.11.0.v28.0.42600.6491.Lite. ...
- vue中使用Echart将一组数据展示出三种统计图
1 <template> 2 <div class="container"> 3 <div id="myEchart" style ...
- software engineering homework 2
博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/1058 ...
- 2月27日Android开发学习
App工程目录结构 App工程分为两个层次,第一个层次是项目,另一个层次是模块. 模块依附于项目,每个项目至少有一个模块.一般而言的"编译运行App",指的是运行某一模块,而非运行 ...
- 第8章 使用标记帮助工具构建表单(ASP.NET Core in Action, 2nd Edition)
本章包括 使用Tag Helpers轻松构建表单 使用锚标记帮助程序生成URL 使用Tag Helpers为Razor添加功能 在第7章中,您了解了Razor模板以及如何使用它们为应用程序生成视图.通 ...
- 2003031118—李伟—Python数据分析五一假期作业—MySQL的安装以及使用
项目 期中试卷 课程班级博客链接 20级数据班(本) 这个作业要求链接 作业要求 博客名称 2003031118-李伟-Python数据分析五一假期作业-MySQL的安装以及使用 要 ...
- Python机器学习/LogisticRegression(逻辑回归模型)(附源码)
LogisticRegression(逻辑回归) 逻辑回归虽然名称上带回归,但实际上它属于监督学习中的分类算法. 1.算法基础 LogisticRegression基本架构源自于Adline算法,只是 ...