缓存穿透,击穿,雪崩

穿透:用户发送缓存和数据库中都没有的请求。如id为-1的数据。

解决方案:

1.接口层增加校验,用户鉴权,不符合条件的不让查询。

2.对于击穿的数据,可以将key-value写成key-null。缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

击穿:用户发送缓存中没有,数据库存在的数据。高并发时频繁请求会造成数据库压力过大。

解决方案:

1.设置热点数据永不过期。

2.加互斥锁。(请求数据库前先加锁)。也就是只让一个线程去访问数据库,其他线程等待那个线程更新数据后再从缓存去查。

雪崩:缓存中的大批数据到了过期时间,而此时查询数据量巨大。引起数据库压力过大。

解决方案:

1.缓存过期时间设置个随机值。防止同时到期
2.热点数据永不过期
3.做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。(这种方式复杂点)
4.可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
5.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值