Redis进阶学习之缓存穿透和雪崩

Redis缓存穿透和雪崩(面试高频,工作常用)

Redis缓存的使用,极大地提升了应用程序的性能和效率,特别是数据查询方面。但同时他也带来一些问题,其中最要害的问题就是数据一致性的问题,从严格意义上来讲,这个问题无解。如果对数据一致性要求很高,那么就不能使用缓存。
另外一些的典型问题就是,缓存穿透、缓存雪崩和缓存击穿,目前业界也有比较流行的解决方案。

缓存处理流程

前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
在这里插入图片描述

缓存穿透(查不到)

概念

缓存穿透的概念跟简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败,当用户很多的时候,缓存都没有命中,于是都去请求持久层数据库,这会给持久层数据库造成很大压力,这时候就相当于出现了缓存穿透。

解决方案

布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免对底层存储系统的查询压力。
在这里插入图片描述

缓存空对象

当存储层不命中后,及时返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再次访问这个数据就会从缓存中获取,保护了后端数据源。
在这里插入图片描述

但这种方法会存在两个问题:

  1. 如果控制能够被缓存起来,这就意味着缓存需要更多的存储空间存储键,因此这当中可能会有很多空值的键;
  2. 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对需要保持一致性的业务有影响。

缓存击穿(量太大,缓存过期)

概述

一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案

  1. 设置热点数据永不过期
    从缓存层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。
  2. 加互斥锁
    分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获取分布式锁的权限,因此只需要等待即可,这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。
    在这里插入图片描述

缓存雪崩

概念

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
在这里插入图片描述

解决方案

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同得缓存数据库中。
  3. 设置热点数据永远不过期。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值