Redis系列(二):Redis缓存穿透和缓存雪崩是什么?
一、Redis穿透
缓存穿透现象:用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
介绍两种常用解决方案:
1.解决方案1:布隆过滤器
参考下面这篇文章,我觉得讲得非常详细了,
详解布隆过滤器的原理、使用场景和注意事项
2.解决方案2:缓存空对象
缓存穿透:黑客发送大量请求,请求的数据是数据库里没有的,每次都会不走缓存,直接走数据库,最后可能造成数据库宕机
解决:只要数据库没查到,就写一个空值到缓存,下次还有这个请求,就可以走缓存了
弊端:
- 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
- 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。
二、Redis击穿
XXX
三、Redis雪崩
缓存雪崩现象:大量key同一时间点全部失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用。
那么思考下以下几个问题:
- Redis缓存为什么会大量key同一时间点全部失败?
- 数据库能支持的最大并发请求数是多少?
- 数据库挂掉了DBA会怎么处理?
要想了解上面的问题,看下下面这张图:
1.Redis为什么会出现大量key同一时间点全部失效?
Redis服务器宕机了,Redis服务器宕机一般是因为并发数超过Redis服务器能支撑的最大的并发数。具体案例可以看下记一次redis挂机导致的服务雪崩事故,不对,是故事~ (非常好的雪崩案例分析)
2.再来看下数据库能支撑的最大并发请求数?
数据库类型 | 支持的最大并发数 | 备注 |
---|---|---|
MySql | 16384 |
受服务器配置,及网络环境等制约,实际服务器支持的并发连接数会小一些,主要决定因素有:
1、服务器CPU及内存的配置。 2、网络的带宽。互联网连接中上行带宽的影响尤为明显。 |
Oracle | 40000 |
1.查看oracle的最大并发数限制,可是查看v$license视图 2.手动计算:每个Session消耗的内存和参数设置有关,如果是DEDICATE(独立模式)方式,sort_area_size大小和PGA内存消耗相关,如果是512K,则大概每个Session消耗3M左右,所以,机器允许的最大并发连接数=(机器内存-ORACLE等系统软件内存-oracleSGa内存)/3m |
Postgre |
大于Oracle |
1.最大连接数也可以在pg配置文件中配置: 在postgresql.conf中设置: max_connections = 500 2.查看为超级用户保留的连接数: show superuser_reserved_connections ; |
3.Redis雪崩的解决方案
(1)redis高可用
这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。
(2)限流降级
这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
(3)数据预热
数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
具体案例可以看下上图案例的解决方案
参考文章:
帮你解读什么是Redis缓存穿透和缓存雪崩(包含解决方案)
详解布隆过滤器的原理、使用场景和注意事项
Redis系列(二):Redis缓存穿透和缓存雪崩是什么?相关推荐
- 深入剖析Redis系列(七) - Redis数据结构之列表
前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
- 深入剖析Redis系列(五) - Redis数据结构之字符串
前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...
- Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
Java相关的面试都会问到缓存的问题:史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等,除此之外还会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等不常见的问题,但却是非 ...
- Redis系列:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等概念 一.缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓 ...
- Redis专题-缓存穿透、缓存雪崩、缓存击穿
一.缓存穿透 缓存穿透概念 缓存穿透是指查询一个一定不存在的数据,在数据库没有,自然在缓存中也不会有.导致用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,如果从存储层 ...
- Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级
一.缓存雪崩: 1.什么是缓存雪崩: 如果缓在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机.这时候如果 ...
- Redis缓存穿透、缓存击穿和缓存雪崩
目录 一.缓存穿透 概念 解决方案 布隆过滤器 缓存空对象 二.缓存击穿 概念 解决方案 使用互斥锁(mutex key) 设置热点数据永不过期 三.缓存雪崩 概念 解决方案 redis高可用 限流降 ...
- redis缓存穿透、缓存雪崩、缓存击穿、并发竞争
关注微信公众号"虾米聊吧",每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流. 缓存穿透.缓存雪崩.缓存击穿.并发竞争是缓存最常见的几个问题,接 ...
最新文章
- 大有乾坤,售前机器人背后的 AI 技术
- VC 2.5 与 ESX 3.0.1 之间存在接口问题
- 如何简化Exchange 2007 OWA URL访问
- windows优化_windows系统优化教程——C盘清理及优化
- 【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证
- php通知websocket,php实现websocket实时消息推送
- linux网络子系统研究:数据收发简略流程图
- PHP清除HTML代码、空格、回车换行符的函数
- 《第三次浪潮》的体会!
- 1. JavaScript 与 PHP 的语法区别
- 存储函数与存储过程的区别
- mac 自带画图软件(mac 打开预览)
- java根据距离算经纬度_java 根据两点经纬度来算距离
- PreparedStatement 大数据查询
- lzg_ad:FBW控制台命令详解
- 高博课程编程作业之计算小萝卜的坐标
- 医院挂号系统代码_智慧医院中心是怎样做的?分诊叫号系统如何正确使用!
- Java新手小白入门篇 项目 - 深海杀手
- 计算机网络语音传输杂音回音,电脑使用麦克风有杂音的解决方法-电脑自学网...
- Call to undefined function bcadd()