Redis面试题之Redis雪崩击穿问题及解决方案

1. Redis缺点

1.1 缓存和数据库双写一致性问题

  • 一致性的问题很常见, 因为数据数据加入到Redis缓存之后, 请求是先从Redis中查询. 如果Redis中有要查询的数据就不会再查询数据库了. 但是, 如果不能保证Redis和数据库的一致性, 就会导致请求获取到的数据不是最新的数据.
  • 如何解决?
  1. 编写删除Redis缓存的接口, 在更新数据库的同时,调用删除Redis缓存的接口删除缓存中的数据. 用户下次访问就是直接访问数据库了同时也把最新数据更新到Redis当中了.
  2. 使用消息队列的方式,将要更新的数据放到消息队列中.

1.2 缓存的并发竞争问题

  • 并发竞争: 指的是同时有多个子系统, 去获取同一个key的value值.
  • 如何解决?
    最简单的方式就是准备一个分布式锁, 大家去抢锁, 抢到锁就可以去获取key的值了.
    后面详细介绍Redis的分布式锁

1.3 缓存雪崩问题

  • 缓存雪崩, 即Redis缓存中的数据, 同一时间大面积的失效, 这个时候又来了一波请求, 结果请求都怼到数据库上, 从而导致数据库连接异常.

  • 举个栗子:如果首页所有 Key 的失效时间都是 12 小时,中午 12 点刷新的,我零点有个大促活动大量用户涌入,假设每秒 6000 个请求,本来缓存可以抗住每秒 5000 个请求,但是缓存中所有 Key 都失效了。
    此时 6000 个/秒的请求全部落在了数据库上,数据库必然扛不住,真实情况可能 DBA 都没反应过来直接挂了。
    此时,如果没什么特别的方案来处理,DBA 很着急,重启数据库,但是数据库立马又被新流量给打死了。这就是应用到项目场景中的缓存雪崩。

  • 如何解决?

  1. 在Redis缓存的失效时间上, 加一个随机值,避免集体同时失效。
    setRedis(key, value, time+Math.random()*10000);
  2. 使用互斥锁,但是该方案吞吐量明显下降了。
  3. 搭建Redis集群, 将热点数据均匀分布在不同的 Redis 库中也能避免全部失效.

1.4 缓存击穿

  • 缓存击穿, 这个跟缓存雪崩有点像, 但是又有一点不一样, 缓存雪崩是因为大面积的缓存失效, 数据库崩溃了,
  • 而缓存击穿不同的是缓存击穿是指存在一个热点数据Key, 有请求不断来访问这个Key,这么多请求在同一段时间内访问这个热点数据, 当这个 Key 失效时间到了的时候, 持续的这么多请求直接怂到数据库上了, 就在这个 Key 值上击穿了缓存.
  • 如何解决?
    设置热点数据永不过期或者加上互斥锁就搞定了.

1.5 缓存穿透

  • 缓存穿透, 缓存穿透是指访问缓存和数据库中都没有的数据, 用户(黑客)恶意访问发起请求.
  • 举个栗子:我们数据库的 id 都是从 1 自增的, 如果发起 id=-1的请求,这样的不断攻击导致数据库压力很, 严重会击垮数据库。
  • 如何解决呢?
  1. 缓存穿透我会在接口层增加校验, 比如用户鉴权, 参数做校验, 不合法的校验直接return, 比如 id 做基础校验, id<=0 直接拦截过滤掉.
  2. Redis 里还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的预防缓存穿透的发生。
    它的原理也很简单, 就是利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在, 不存在你 return 就好了, 存在你就去查 数据库刷新 KV 再 return.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值