Redis的穿透、击穿、雪崩问题
目录
Redis穿透
解决方法1:布隆过滤器
解决方法2:返回空对象
解决方法3:接口校验
Redis击穿
解决方案1:可以设置热点数据永远不过期
解决方案2:添加锁
Redis雪崩
解决方案1:加互斥锁
解决方案2:将key的过期时间随机化
解决方案3:使用Redis集群提高可用性
解决方案4:数据预热
补充:
因为Redis是在内存中操作的,速度很快,所以我们经常使用Redis缓存数据。但是东西总有两面性,Redis也有它的问题,就是穿透、击穿、雪崩问题,现在记录一下。
Redis穿透
定义:如果我们查询一个数据会先到缓存中查,如果没有才去数据库查。如果有人利用不存在的key一直访问就会一直到数据库中查,这样就会导致Redis缓存穿透掉直接到数据库。这样肯定是不好的。
解决方法1:布隆过滤器
将所有可能存在数据,分别通过多个哈希函数生成多个哈希值,然后将这些哈希值存到一个足够大的bitmap中,此时一个一定不存在的数据就会被这个bitmap拦截直接return,从而减少了数据库的查询压力。
解决方法2:返回空对象
当某个请求的key在redis缓存和数据库中都查不到数据时,直接将这个key对应的空数据存在redis中,这样下次这个key又过来就直接走缓存,就不会到数据库中了,这个key和空数据应该设置过期时间,防止存储过多空数据浪费内存。
redisCache.getItem(key) = null & 数据库中也查不到redisCache.setItem(key,null,2分钟,minute)
解决方法3:接口校验
在接口层,获取请求的参数进行校验,发现有不合法的key直接return掉,连查询都不给机会。
boolean isNormal = checkKey(key);
if(isNormal){return ...
}
Redis击穿
定义:某一个热点key在redis缓存中过期失效了,这时大量用户对这个热点数据进行请求,但是由于缓存中已经失效了,就会到数据库中查询,此时数据库一时处理大量的查询,又是同样的数据像在数据库上击穿了一个点。
解决方案1:可以设置热点数据永远不过期
将那些用户经常查询的数据对应的key设置永远不过期,就可以保证走缓存了。
解决方案2:添加锁
可以使用分布式锁或互斥锁。多个请求都同时查询这个热点数据,使用锁机制只让第一个请求获取锁去数据库查这个热点数据,其他线程保持阻塞,这个热点数据查询出来后写入到redis缓存中,其他请求后面从缓存中取数据即可。
Redis雪崩
定义:和击穿不同的是,击穿是某条数据过期了。雪崩是大批量数据都过期了,而这大批量数据的请求过来后,Redis缓存失效,请求直接落到数据库上,引起数据库压力过大甚至宕机。
解决方案1:加互斥锁
跟缓存击穿解决思路一致,大量请求只有第一个请求获得到锁才能查询数据库,然后将数据写入redis后释放锁,其他请求直接查缓存。
解决方案2:将key的过期时间随机化
打乱key的过期时间,避免大批量的key同时过期,这样就不会有大量请求同一时间都查询数据库。或者将经常访问的数据的key永远不过期。
解决方案3:使用Redis集群提高可用性
使用Redis主从+哨兵,主Redis失效了或者宕机了,使用哨兵将从机切换成主机,这样就算一个缓存失效了,也有另一个顶上。
解决方案4:数据预热
在正式部署之前,把可能的数据直接写入到缓存中,这样就可避免在系统上线后这些热点数据被大量请求走数据库。
补充:
redis哨兵模式:针对Redis集群,Redis提供了哨兵模式的命令,哨兵是一个独立运行的进程,原理是哨兵通过向Redis集群发送命令,通过Redis服务器返回其状态监控Redis服务器的状态,当哨兵监测到Redis主机宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他服务器,修改配置文件,让他们换主机。
以上知识点记录好,后面遇到问题一定还是需要条件去实操验证呀!
Redis的穿透、击穿、雪崩问题相关推荐
- Redis缓存穿透击穿雪崩
目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...
- Redis缓存/穿透/击穿/雪崩
目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...
- 一文搞懂Redis缓存穿透/击穿/雪崩
缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...
- 二十七、Redis缓存穿透和雪崩(完)
Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...
- 21_Redis_浅析Redis缓存穿透和雪崩
为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...
- Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略
1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...
- 什么是redis缓存穿透, 缓存雪崩, 缓存击穿
什么是redis? redis是一个非关系型数据库,相对于其他数据库而言,它的查询速度极快,且能承受的瞬时并发量非常的高.所以常常被用来存放网站的缓存,以减少主要数据库(如mysql)的服务器压力. ...
- Redis缓存穿透击穿和雪崩(八)
1. 缓存穿透 1.1. 定义 如果用户的请求Redis缓存没有,mysql持久层也没有这个数据,于是本地查询失败.当用户请求很多(或者恶意攻击)且都是这种缓存和持久层都没有命中的情况时,大量的请求持 ...
- 一篇吃透Redis缓存穿透、雪崩、击穿问题
前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:"如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机" ...
- Redis总结以及击穿,雪崩,缓存穿透,哨兵机制解答
Redis Redis是什么? Redis 是一个使用 C 语言开发的高速缓存数据库. Redis进行数据库切换命令 SELECT index 数据库索引号index用数字值指定,以0作为起始索 ...
最新文章
- ARM Cortex Debug Port Access Port DP AP JTAG-DP SW-DP SWJ-DP JTAG-AP MEM-AP
- linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题
- 云计算灾备:灾备通识
- ajax 公共请求头部,ajax请求中全局增加请求头,如常见的token
- python alpha_如何用Python打造一个简易版的Alpha GO?
- mysql 开启引擎命令_MySql中启用InnoDB数据引擎的方法
- 计算机英语笑话,关于计算机的幽默笑话
- [html] 写html代码时,怎样才加速写代码的速度呢?你有什么方法?
- 深入理解C++中的RVO
- dojo调用php,dojo学习第一天 Tab选项卡 实现_dojo
- mac netbeans java_在macOS上不安装JDK的情况下安装Netbeans
- linux nfs async,Linux下NFS共享以及oracle rman挂载优化
- java interface泛型_JAVA的接口泛型
- mac上配置java jdk环境
- 操作系统进程调度实验
- 双11薇娅直播,双芯旗舰iQOO Neo5斩获天猫平台销冠
- svm+特征提取做分类
- 神码ai人工智能写作机器人_机器学习简介part1与人工智能的比较
- 2.5 纳什均衡的存在性
- 查询rssi指令_RSSI测量方法及网络设备、终端设备与流程