先放总结图:


异常一:缓存与数据库数据要保持实时一致性

  • 如果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缓存(三)缓存异常的四个方面:数据同步、缓存雪崩、击穿、穿透相关推荐

  1. 顶级“Redis学习笔记”,缓存雪崩+击穿+穿透+集群+分布式锁,NB了

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  2. OSChina_IOS版客户端笔记(四)_程序数据、缓存的管理

    为什么80%的码农都做不了架构师?>>>    程序的数据缓存问题.首先常见的程序数据可以分为以下几种: · 列表.表格等在线请求的动态数据 · 图片数据,可以是列表中在线请求的 · ...

  3. 缓存雪崩 击穿 穿透

    缓存穿透 **缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意 ...

  4. redis 雪崩 击穿 穿透

    雪崩,redis大面积key失效,导致大量请求落到了DB上 击穿,单一key失效,导致大量请求落到DB上 穿透,redis与DB中都没有这个key,导致穿透

  5. redis的雪崩 击穿 穿透以及解决方案

    雪崩:众多缓存数据同一时间到期导致大量请求同时达到数据库,致使数据库超负荷. 解决方案: 1.数据对时间不敏感:到期时间加一个随机值 2.数据必须在某一时刻到期:客户端请求的时候加个延迟. 击穿:某一 ...

  6. 分布式存储系统中的数据高效缓存方法

    点击上方蓝字关注我们 分布式存储系统中的数据高效缓存方法 杨青霖, 吴桂勇, 张广艳 清华大学计算机科学与技术系,北京 100084 摘要:针对典型分布式存储系统存在的写放大.I/O路径过长.响应时延 ...

  7. 无盘服务器镜像包缓存设多少,【转】谈谈深度无盘缓存工具设置技巧

    提到无盘的缓存设置,我相信论坛上的网管朋友绝对不会陌生,毕竟我们每天在这里聊的人,基本上平常都做过无盘都差不多用过supercache,而我们平常提到的如何提高带机量这些相关话题,什么一台服务器带15 ...

  8. [NewLife.XCode]数据层缓存(网站性能翻10倍)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  9. TCP协议---三次握手和四次挥手详解 (不看后悔系列)

    目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...

  10. redis 穿透 雪崩 击穿

    redis 穿透 雪崩 击穿 穿透 击穿 雪崩 穿透 什么是穿透? key对应的数据在缓存中不存在,针对key的请求在缓存中获取不到,请求会到数据库中.缓存没有起到作用,像是被击穿了一样. 如果有恶意 ...

最新文章

  1. C++中const的用法
  2. 操作主机 RID matser[为企业维护windows server 2008系列七]
  3. java继承的生活例子,帮你突破瓶颈
  4. c++类指针赋值表达式必须是可修改的左值_C++进阶教程系列:全面理解C++中的类...
  5. Redis的事务:相关命令 watch 与mysql事务的区别
  6. 杭州计算机学校哪家好,杭州2021年哪所计算机学校比较好
  7. 32位CentOS系统安装kernel-PAE支持4g以上内存
  8. C++的const修饰
  9. mongodb数据库在centos 下启动
  10. struts2中的session使用
  11. 忙了1天的qte-arm环境的搭建
  12. python标准输入多行文字_python如何输入多行数据
  13. MFC | 基于文档存储的学生成绩信息管理系统
  14. 【小程序项目分享】多功能抽签分组系统
  15. xml建模包括以下_我们的服务|无人机倾斜摄影三维建模
  16. jDBC连接mysql数据库的5种方式
  17. 合作共赢:加密云储——穿针引线,布局IPFS分布式存储领域
  18. C语言实现选择排序——堆排序(大根堆、小根堆)
  19. 谁要GMAIL和Orkut的邀请?
  20. 苹果笔记本python怎么换行_python怎么换行,我的换行就是执行啊

热门文章

  1. 高斯消元法(matlab)
  2. python 进程池pool使用详解
  3. ewb交通灯报告和文件_数字电路基础红绿灯实验报告.docx
  4. 小公司如何做项目管理流程
  5. php全角数字转半角,php代码中全角数字如何转半角
  6. hadoop之大数据生态系统的前世今生
  7. c++基础复习(2)
  8. 网络安全设备常见弱口令
  9. 华为服务器故障灯不开机_华为手机开不了机指示灯亮怎么办?
  10. 【学习笔记】分布式追踪Tracing