当前位置: 首页 > news >正文

【Redis缓存架构实战常见问题剖析】

文章目录

  • 一、Redis缓存架构实战剖析
    • 1.1、大规模的商品缓存数据冷热分离机制
    • 1.2、缓存击穿导致线上数据压力暴增解决方案
    • 1.3、缓存穿透及其解决方案剖析
    • 1.4、突发性的热点缓存数重建导致系统压力暴增问题分析
    • 1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析
    • 1.6、利用多级缓存解决Redis线上集群缓存雪崩问题分析

一、Redis缓存架构实战剖析

1.1、大规模的商品缓存数据冷热分离机制

我们都知道,缓存的内存资源是有限的,例如像jd、tb等大平台的商品信息,商品信息都是很多的,不可能是将所有的商品数据都缓存,那应该缓存那些数据,结合生活中的实际问题,需要缓存的数无非就是经常被大众点击查看或者购买的商品,那我们在对资源进行缓存时,会给其数据设置一个过期时间,如果时间过了都没被访问,那就需要从缓存中移除==>我就是冷数据,如果是被访问了,我们需要将当前数据的过期时间重新更新,延长其过期时间,保证这种经常被访问的数据属于长时间不过期的数据,也就是热数据,这样子我们就可以将不同访问频率的数据区分开来
在这里插入图片描述

1.2、缓存击穿导致线上数据压力暴增解决方案

在对这个问题解决之前:首先我们需要先知道,什么是缓存击穿?产生的原因是什么?
缓存击穿,也称为缓存失效,主要是指由于大批量的缓存在同一时间失效,可能导致大量的请求穿透缓存访问到数据库上,导致数据库的压力暴增甚至导致数据库挂掉,我们就称这种现象为缓存击穿

其解决方案主要是从产生问题的原因入手,我们可以调整批量导入的不同数据的缓存时间,例如,在设置不同key数据时,以基底时间+随机生成的时间,来避免同一时间大批量的缓存数据失效问题,如下图示:
在这里插入图片描述

1.3、缓存穿透及其解决方案剖析

缓存击穿,主要是指客户端查询一个不存在数据(Redis和数据库都不存在),缓存不会命中,数据库也不会命中,从而导致大批量的数据访问到数据库层,导致数据库的压力倍增,那产生这种问题的原因是多方面的,例如:写的业务代码逻辑出问题、平台被恶意攻击等

解决方也是多方面的,主要有:
1、缓存空对象:我们在访问某个key时,如果Redis和数据库都查询不到数据,那我们就可以在Redis中缓存一个空对象信息,如果下次同样的key再次访问,就可以直接在Redis中获取且返回即可,当然,我们还需要考虑恶意攻击的,以不同的key来大量访问,那我们在上一步设置key时,加入一个缓存数据过期时间,类似空对象的数据,过期时间我们不用设置太长时间即可,如下图示:

在这里插入图片描述

2、使用布隆过滤器:对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。

1.4、突发性的热点缓存数重建导致系统压力暴增问题分析

这张突发性的热点缓存数据,主要的场景为,例如:大V直播带货,可能介绍的商品之前属于三不问商品,好东西没被发掘,在直播大V介绍一通后,涌入一大波人对该商品进行查看以及购买等操作,那这时,Redis是无此商品信息的,大量的请求全打到数据库上,导致数据库压力暴增,甚至宕机等,针对这个问题,我们需要对该商品数据进行缓存数据重建,如何重建?我们这采用的双重校验机制===>过程为先从缓存中拿数据,如果拿不到数据,就利用分布式锁加锁(可优化,结合业务场景采用分段锁或读写锁方式),加锁模块中,再重新到Redis缓存中拿数据,如果拿不到,就需要到数据库读取数据,同时缓存数据到Redis缓存中,以便下次其他线程拿数据时,不用到数据库中拿数据,如下图:
在这里插入图片描述

1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析

出现这个问题的主要原因是因为在大并发场景下,一个线程向数据库写数据,正打算往Redis缓存中同步数据时,另外的线程吧数据库的数据改了,例如:A线程将数据库数据改为:10,正准备将10同步到Redis,这个过程中被线程B打断,将数据库的数据改为6,然后A线程将Redis的数据改为10,这样子就导致了数据库与缓存数据双写不一致问题,如下图:
在这里插入图片描述
解决方案主要为,在这个操作的过程中加锁,例如线程A操作时,需要将数据库写入数据与缓存更新这个过程加一把分布式锁即可

1.6、利用多级缓存解决Redis线上集群缓存雪崩问题分析

缓存雪崩主要是指,当Redis服务支撑不住宕机后,很大流量就打到后端的储存层,储存层也支撑不住如此巨大流量,进一步演化到后端服务崩盘,前端同时有可能也崩盘,导致整个服务崩盘的过程就称为缓存雪崩,解决类似问题,我们可以从以下方面着手:
1、设置缓存集群RedisCluster或者哨兵Sentinel机制
2、进行服务降级以及熔断操作,比如使用微服务中的流量防卫兵Sentinel或Hystrix等

http://www.lryc.cn/news/224989.html

相关文章:

  • mac M2 pytorch_geometric安装
  • 【C++】异常 智能指针
  • 切换数据库的临时表空间为temp1 / 切换数据库的undo表空间为 undotbs01
  • react: scss使用样式
  • JAVA深化篇_36—— Java网络编程中的常用类
  • python操作链接数据库和Mysql中的事务在python的处理
  • 【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline
  • muduo源码剖析之TcpClient客户端类
  • C语言——switch语句判断星期
  • 栈回溯之CmBacktrace
  • node插件MongoDB(二)——MongoDB的基本命令
  • 【Git】推送Github失败:remote: Permission to xxx/*.git denied to xxx
  • Flink -- 状态与容错
  • Linux C语言进阶-D15递归函数和函数指针
  • LeetCode算法心得——全排列(回溯型排列)
  • 读取W25Q64的设备ID时输出0xff
  • 【Docker】Docker 网络
  • Flutter学习:使用CustomPaint绘制路径
  • 软件模拟SPI协议的理解和使用编写W25Q64
  • SQLI手动注入和python sqlmap代码注入
  • MemcachedRedis构建缓存服务器 (数据持久化,主从同步,哨兵模式)
  • Python语法基础(变量 注释 数据类型 输入与输出 运算符 缩进)
  • linux espeak语音tts;pyttsx3 ubuntu使用
  • 小白该如何学习Linux操作系统?
  • 2023双十一:实体门店闯入,第二战场全面开战
  • 操作系统·处理机调度死锁
  • SQL第四次上机实验
  • 读书笔记:彼得·德鲁克《认识管理》第11章 若干例外及经验教训
  • JVM-虚拟机的故障处理与调优案例分析
  • JMeter 相关的面试题