缓存穿透、缓存击穿、缓存雪崩

缓存穿透

什么是缓存穿透?

缓存穿透是指查询的数据,在redis数据库中没有,也就是缓存未命中,然后去到持久层数据库中查询,数据还是没有,然后当大量查询空数据的情况出现,会给持久层数据库造成巨大的压力,就会造成缓存穿透的情况。(相当于一直查询没有的空数据)

如何解决缓存穿透?

1.使用布隆过滤器
布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
在这里插入图片描述
2.缓存空对象
即使在数据库中没有查询到数据,也给缓存设置个空值,设置一个比较短的过期时间,防止同一时间内多次查询一个不存在的数据来攻击的情况。

但是存在两个问题:

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

缓存击穿

什么是缓存击穿?

缓存击穿指高热点的数据,大量的查询请求查询高热点数据,当高热点的缓存数据过期的一瞬间,在高并发的情况下,大量请求去访问持久层数据库来查询该数据,造成数据库压力过大,造成缓存击穿。
(与缓存穿透不同的地方在于,这是相当于一个点,而且这个是能在持久层数据库查询到,而缓存穿透在持久层数据库也无法查询到。)

如何解决缓存穿透?

  1. 设置热点数据永不过期
  2. 加互斥锁,可以使用分布式锁,保证一个key同时只有一个线程去查询,将高并发的压力转移到分布式锁,对分布式锁的要求很高。

缓存雪崩

什么是缓存雪崩?

缓存雪崩是指在同一时刻内,大量的缓存数据同时过期,导致一堆各种查询请求直接到数据库,造成数据库压力过大,也有一种是因为缓存服务器宕机造成,一瞬间将数据库压垮,这种更加严重。

如何解决缓存雪崩?

  1. 搭建redis集群,保证redis的高可用,一台宕机后另一台快速补上
  2. 同样可以加互斥锁,使一个key同时只有一个线程访问
  3. 键的过期时间尽量保持一个随机性,防止同一时刻内大量过期,让过期的时间点尽量均匀
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值