关于Redis的缓存问题的说明和解决方案

在使用Redis时,在高并发场景下会出现一些问题,常见的问题有:缓存击穿、缓存雪崩、缓存穿透,这三个问题也是面试时的高频问题。

一,缓存击穿

1,说明:缓存击穿是指,某一热点数据存储到redis中,该数据处于高并发场景下,如果此时该key过期失效,这样就会有大量的并发请求进入到数据库,对数据库产生大的压力,甚至会压垮数据库。

2,解决方案:针对这种情况解决方案有种,第一种,热点数据不设置过期时间。第二种:使用互斥锁,可以使用redisson的分布式锁实现,就是从redis中查询不到数据时,不要立刻去查数据库,而是先获取锁,获取到锁后再去查询数据库,而其他未获取到锁的请求进行重试,这样就可以确保只有一个查询数据库并且更新缓存的请求。

二,缓存雪崩

1,说明:产生缓存雪崩一般有两种情况:

情况1:由于大量 key 设置了相同的过期时间(数据在缓存和数据库都存在),一旦到达过期时间点,这些 key 集体失效,造成访问这些 key 的请求全部进入数据库。

情况2:Redis 实例宕机,大量请求进入数据库。

2,解决方案:

针对于雪崩问题,可以分情况进行解决:

情况1的解决方案:

错开过期时间:在过期时间上加上随机值(比如 1~5 分钟)服务降级:暂停非核心数据查询缓存,返回预定义信息(错误页面,空值等)

情况2的解决方案:

事前预防:搭建高可用集群

构建多级缓存,实现成本稍高

熔断:通过监控一旦雪崩出现,暂停缓存访问待实例恢复,返回预定义信息(有损方案)

限流:通过监控一旦发现数据库访问量超过阈值,限制访问数据库的请求数(有损方案)

三,缓存穿透

1.说明:缓存穿透是指,如果一个 key 在缓存和数据库都不存在,那么访问这个 key 每次都会进入数据库,很可能被恶意请求利用,缓存雪崩与缓存击穿都是数据库中有,但缓存暂时缺失缓存雪崩与缓存击穿都能自然恢复,但缓存穿透则不能

2.解决方案:

针对缓存穿透,一般有两种解决方案,分别是:

如果数据库没有,也将此不存在的 key 关联 null 值放入缓存,缺点是这样的 key 没有任何业务作用,白占空间

采用BloomFilter(布隆过滤器)解决,基本思路就是将存在数据的哈希值存储到一个足够大的Bitmap(Bit为单位存储数据,可以大大节省存储空间)中,在查询redis时,先查询布隆过滤器,如果数据不存在直接返回即可,如果存在的话,再执行缓存中命中、数据库查询等操作。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值