缓存之缓存击穿/穿透/雪崩

Redis高频面试题
缓存穿透

概念
有一个查询接口,频繁接受到数据库中并不存在的查询条件,每次根据key查询缓存中都查不到,则这些查询请求纷纷落到数据库上,请求量大,造成数据库频繁IO最终宕机。例如接口是根据id获取用户,查询参数为-1、-2这种数据库根本没有的数据。
解决方案
1. 在Redis中缓存不存在的查询结果。
每当接口被请求时,如果数据库返回为空,则依旧往Redis里根据查询的key写入缓存,这样下次再来同样的请求则可以直接走缓存取数据
问题
当频繁调用接口查数据这个操作是黑客在弄时,就会发现这种情况。每次调接口所使用的请求参数都不相同,这样就会造成Redis中有大量的无效key存储的空数据,极大浪费空间。
2. 布隆过滤器
布隆过滤器可以简单高效地解决缓存穿透问题。布隆过滤器可以实现将数据库中存在的键都放置进去,这样在查询请求过来时,先走布隆过滤器,布隆过滤器会返回这个key是一定不存在或者可能存在,如果判定结果是一定不存在,则直接返回即可,不需要再走缓存和数据库;如果是可能存在,则继续走缓存-数据库。

缓存击穿

概念
某一热点数据,在Redis缓存的数据超期导致缓存失效,同一时间很多请求同时请求,因缓存中没有查询到数据,则这些请求直接全部落到数据库,造成数据库压力过大。
解决方案
1. Redis某些持久的热点数据的过期时间设置为永远
2. 在热点缓存数据即将过期前进行续约
目前能想到的做法是在缓存完数据后扔到mq队列中,TTL设置的比缓存过期时间少一点,这个队列并不设置消费者。在此消息的TTL过期后进入死信队列,死信队列的消费者(即续约方法)去续约Redis的热点数据。
3. 互斥锁
在缓存数据失效后,往Redis里写数据的方法加锁,在更新完Redis后其它方法可直接从Redis里获取热点数据并返回。但这样做可能导致大批请求等锁的情况,并不合适。

缓存雪崩

概念
Redi服务因为各种原因宕机,缓存层失效,导致请求全部打到数据库上。
解决方案
1. 雪崩前:搭建Redis集群实现Redis的高可用
雪崩中:实现服务的熔断、降级
雪崩后:Redis选择性做持久化,在重启后直接加载持久化数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值