Redis缓存(三)缓存异常的四个方面:数据同步、缓存雪崩、击穿、穿透
先放总结图:
异常一:缓存与数据库数据要保持实时一致性
- 如果Redis为只读模式,更新数据时直接更新MySQL里的数据,同时删除Redis里的旧数据;
- 如果Redis为读写模式,更新数据时Redis和MySQL中都要更新,存在两个问题。
1. Redis与数据库中各自操作成功/失败的原子性 ------ 成功/失败问题
解决方案: 消息队列,更新失败后可以再次从消息队列读取更新信息,再次更新;
2. 高并发时,Redis与数据库更新操作间隔时间内有客户端请求,此时得到的数据是旧数据(旧数据可能会被更新到Redis,如果之后不清除Redis,那么往后的请求都将读到Redis中的旧数据)----- 谁先谁后问题
解决方案:延迟双删,更新数据前先删除Redis旧数据 — 更新数据库 — 线程sleep一段时间 —再检查删除Redis中的旧数据(难以计算需要sleep多久,不知道其他线程什么时候将旧数据更新到Redis,sleep时间短了的话,Redis中更新的新数据之后还是会被其他线程改为他们读到的旧数据)
针对问题一二的最终解决方案(强一致性)
- 使用分布式事务锁,对问题一保证原子性,对问题二保证串行性。
异常二:缓存雪崩(大量数据失效)的原因,Redis中大量数据同时过期 / Redis宕机需要恢复
解决方案
雪崩前预防:
- A) 设置不同过期时间
雪崩后补救:
- A) 服务降级:拒绝非核心数据访问数据库,允许核心数据继续访问数据库获取数据(在数据库能承受的压力内)
- B) 服务限流:不管是访问核心还是非核心数据,直接限制单位时间内能处理的请求数量
- C) 服务熔断:直接返回异常给客户端,直到Redis恢复后再提供访问请求
异常三:缓存击穿(单个热点数据失效),设置热点数据不过期
异常四:缓存穿透,数据库Redis中均不存在数据,给两者都造成很大压力(业务误删数据或者恶意访问)
解决方案:
A) 发生穿透后在Redis中缓存一个约定好的数值,业务层得到该约定的数值后会得知发生了缓存穿透;
B) 布隆过滤器(bit数组,数组每个元素取0/1)快速确认数据库中是否存在该值:
MySQL插入数据时到布隆过滤器中进行一个映射;
- 数据X存入数据库时,用N个hash函数计算该数据得到N个数值, i = hash_i(X)
- 这N个值对过滤器数组长度取模,找到模值对应的数组下标,index_i = i % nums.length
- 将这几个下标位置的值置1,nums[index_i] = 1’
查询数据库前,数据X先根据布隆算法求解bit数组,与布隆过滤器中的数组对比,bit数组中有一个元素0/1取值不对就代表数据库中不存在该数据,放弃继续访问数据库。
C) 请求拦截:在拦截器中拦截非法访问
参考文章:
https://time.geekbang.org/column/article/296586
Redis缓存(三)缓存异常的四个方面:数据同步、缓存雪崩、击穿、穿透相关推荐
- 顶级“Redis学习笔记”,缓存雪崩+击穿+穿透+集群+分布式锁,NB了
如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...
- OSChina_IOS版客户端笔记(四)_程序数据、缓存的管理
为什么80%的码农都做不了架构师?>>> 程序的数据缓存问题.首先常见的程序数据可以分为以下几种: · 列表.表格等在线请求的动态数据 · 图片数据,可以是列表中在线请求的 · ...
- 缓存雪崩 击穿 穿透
缓存穿透 **缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意 ...
- redis 雪崩 击穿 穿透
雪崩,redis大面积key失效,导致大量请求落到了DB上 击穿,单一key失效,导致大量请求落到DB上 穿透,redis与DB中都没有这个key,导致穿透
- redis的雪崩 击穿 穿透以及解决方案
雪崩:众多缓存数据同一时间到期导致大量请求同时达到数据库,致使数据库超负荷. 解决方案: 1.数据对时间不敏感:到期时间加一个随机值 2.数据必须在某一时刻到期:客户端请求的时候加个延迟. 击穿:某一 ...
- 分布式存储系统中的数据高效缓存方法
点击上方蓝字关注我们 分布式存储系统中的数据高效缓存方法 杨青霖, 吴桂勇, 张广艳 清华大学计算机科学与技术系,北京 100084 摘要:针对典型分布式存储系统存在的写放大.I/O路径过长.响应时延 ...
- 无盘服务器镜像包缓存设多少,【转】谈谈深度无盘缓存工具设置技巧
提到无盘的缓存设置,我相信论坛上的网管朋友绝对不会陌生,毕竟我们每天在这里聊的人,基本上平常都做过无盘都差不多用过supercache,而我们平常提到的如何提高带机量这些相关话题,什么一台服务器带15 ...
- [NewLife.XCode]数据层缓存(网站性能翻10倍)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- TCP协议---三次握手和四次挥手详解 (不看后悔系列)
目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...
- redis 穿透 雪崩 击穿
redis 穿透 雪崩 击穿 穿透 击穿 雪崩 穿透 什么是穿透? key对应的数据在缓存中不存在,针对key的请求在缓存中获取不到,请求会到数据库中.缓存没有起到作用,像是被击穿了一样. 如果有恶意 ...
最新文章
- C++中const的用法
- 操作主机 RID matser[为企业维护windows server 2008系列七]
- java继承的生活例子,帮你突破瓶颈
- c++类指针赋值表达式必须是可修改的左值_C++进阶教程系列:全面理解C++中的类...
- Redis的事务:相关命令 watch 与mysql事务的区别
- 杭州计算机学校哪家好,杭州2021年哪所计算机学校比较好
- 32位CentOS系统安装kernel-PAE支持4g以上内存
- C++的const修饰
- mongodb数据库在centos 下启动
- struts2中的session使用
- 忙了1天的qte-arm环境的搭建
- python标准输入多行文字_python如何输入多行数据
- MFC | 基于文档存储的学生成绩信息管理系统
- 【小程序项目分享】多功能抽签分组系统
- xml建模包括以下_我们的服务|无人机倾斜摄影三维建模
- jDBC连接mysql数据库的5种方式
- 合作共赢:加密云储——穿针引线,布局IPFS分布式存储领域
- C语言实现选择排序——堆排序(大根堆、小根堆)
- 谁要GMAIL和Orkut的邀请?
- 苹果笔记本python怎么换行_python怎么换行,我的换行就是执行啊