深入了解Redis(7)-缓存穿透,雪崩,击穿
redis作为一个内存数据库,在生产环境中使用会遇到许多问题,特别是像电商系统用来存储热点数据,容易出现缓存穿透,雪崩,击穿等问题。所以实际运用中需要做好前期处理工作。
一、缓存雪崩
1、概念
缓存雪崩,是指在某一个时间段,缓存集中过期失效。其实这个挺好理解的,举个例子,假如我们把首页的热点数据都设置为1小时过期,刚好这个时候有个秒杀活动,大量的用户请求直接打到数据库。数据库直接被打挂,如果没做好高可用策略,跟这个数据库相关的接口会报错。即使重启数据库,也会被新的用户请求打挂。这种大面积奔溃俗称缓存雪崩。
2、解决方案
看了上面的例子,就会发现解决方案很简单,只需要让缓存不要在同一时间点失效。可以采取不同分类的数据,使用不同周期的失效时间。同一分类的数据,在失效时间上加入随机因子。如果是特别热门的数据,也可以设置永远不过期,有更新操作再更新缓存就可以。
二、缓存击穿
1、概念
缓存击穿跟缓存雪崩是一个道理,只不过击穿是一个点,雪崩是大量缓存key,同样是承受着高并发。具体是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
2、解决方案
其实这个更简单,如果有这种类型的数据,直接设置永不过期即可。
三、缓存穿透
1、概念
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
2、解决方案
缓存穿透的解决方案比较多,下面列两个解决方案。
- 一般来说,我们查询到数据库返回的对象为空时,就不会放入缓存。但针对这个问题,我们可以先对请求参数做参数校验,不合法的参数直接return,不经过缓存和数据库。如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。如果是同一ip反复攻击,可以直接让运维拉黑。
- redis自带一个高级用法:Bloom Filter。这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
Bloom Filter简单运用
public class App {
/**
* 自定义过滤器
*/
private static final String NAME = "specialBloom";
/**
* 初始容量
*/
private static final long INIT_CAPACITY = 10000;
/**
* 错判率
*/
private static final double ERROR_RATE = 0.0001;
public static void main(String[] args) {
Client client = new Client("127.0.0.1", 7001);
//client.delete(NAME);
// 新建一个自定义过滤器
client.createFilter(NAME, INIT_CAPACITY, ERROR_RATE);
// 批量添加
client.addMulti(NAME, "foo", "bar", "baz", "bat", "bag");
String key = "foo";
// 判断key是否存在过滤器中 存在 true 不存在false
boolean result = client.exists(NAME, key);
log.info("判断 [{}]NAME过滤器中,结果为 -> [{}]", key, result);
}
}
深入了解Redis(7)-缓存穿透,雪崩,击穿的更多相关文章
- redis的缓存穿透、击穿、雪崩以及实用解决方案
今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣, ...
- 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩
前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...
- Redis高级应用解析:缓存穿透、击穿、雪崩
1 背景 像我们去面试一些大公司的时候,就会遇到一些关于缓存的问题.可能很多同学都是接触过,多多少少了解一些,但是如果没有好好记录这些内容,不熟练精通的话,在真正面试的时候,就很难答出来了. 在我们的 ...
- redis 缓存穿透、击穿、雪崩
缓存穿透: 大量查询 redis 中不存在的key(用随救数进行查询),导致每次都会去查询数据库,造成数据库压力过大(甚至宕机). 解决办法: 1.对我们的 api 接口 进行限流处理.用户授权.黑名 ...
- Redis缓存穿透、击穿、雪崩,数据库与缓存一致性
Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...
- Redis 17 缓存穿透 缓存击穿 缓存雪崩
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 使用缓存的问题 ...
- redis:缓存穿透、缓存击穿、缓存雪崩
缓存穿透的解决方案(空标记) 缓存穿透是指,在数据存储系统中不存在的记录,不会被存储到缓存中.这种记录每次的查询流量都会穿透到数据存储层.在高流量的场景下,不断查询空结果会大量消耗数据查询服务的资源, ...
- 【Redis】缓存穿透与缓存雪崩
一.缓存雪崩 1.1 缓存雪崩产生的原因 1.2 解决方案 1.3 锁的方式 1.4 消息中间件 1.5 一级和二级缓存 1.6 均摊分配redis key 失效时间 二.缓存穿透 一.缓存雪崩 1. ...
- Redis的缓存穿透问题和雪崩问题?
缓存穿透:就是访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询. 如果是黑客,进行恶意攻击的时候,每次都请求超过2000个/秒的时候,这个时候mysql基本上就挂了. 解决 ...
随机推荐
- 汽车芯片如何高效符合ISO 26262功能安全标准
汽车芯片和集成电路(IC)是高级驾驶员辅助系统(advanced driver assistance systems-ADAS)和联网自动驾驶汽车(connected autonomous veh ...
- Kubernetes 初体验(先占个坑)
- TP6.0 获取请求对象的五种方式
目录 1. 门面类 2. 依赖注入 3. 框架提供的基础控制器的 request 属性 4. request() 助手函数 5. app() 超级助手函数 think\Request.think\fa ...
- swift基本数据类型使用-数组使用
目录 数组的使用 1.数组的定义 2.对可变数组的基本操作 3.数组的遍历 4.数组的合并 5. 示例 数组的使用 1.数组的定义 1> 定义不可变数组 2> 定义可变数组 2.对可变数组 ...
- Tomcat 第二篇:启动流程
1 Tomcat 基本知识 首先介绍一些 Tomcat 的基本知识,防止有纯小白看的云里雾里的. 下面这张图是一个下载好二进制版的的 Tomcat ,直接解压得到的,虽然版本是 9.x ,但是这个目录 ...
- Linux常用命令详解(1)
基础命令:lsmanpwdcdmkdirechotouchcpmvrmrmdircatmorelessheadtailclearpoweroffreboot进阶命令(下一章节):aliasunalia ...
- h5页面在浏览器上好好的,到手机上熄火了又看不到报错信息怎么办?
背景 最近小编接了一个新需求,用h5开发页面,通过webview嵌入原生APP中,自己在浏览器上开发爽歪歪,什么信息都能看到,可是一嵌入原生app中,瞬间就熄火了,啥也看不到了,不知道为什么,反正就是 ...
- 2.Buffer详解
- pytest自学第二期
2.1 通过python解释器调用 pytest 我不知道有什么用:-) 以后就这样,如果有自己学过但是不知道的东西,就挂在那里晒着鞭尸,一直不会就一直鞭尸,直到自己参透了其中的道理再回到这里补全 在 ...
- Java操作Elasticsearch 之 [Java High Level REST Clientedit]
1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json. 向 Ela ...