聊聊:Redis缓存击穿和雪崩《Java-2021面试谈资系列》

Redis高频面试点

  • 一、缓存穿透
    • 1.1概述:
    • 1.2解决方法:
  • 二、缓存击穿
    • 2.1概述:
    • 2.2解决办法:
  • 三、缓存雪崩
    • 3.1概述:
    • 3.2解决方法:

一、缓存穿透

1.1概述:

缓存穿透是指查询一个一定不存在的数据,当我们的缓存中没有这样的数据时,就会去数据库中查,当数据库中也没有时,由于查询不到,数据就会一直请求,一直不断的查询;当有大量不存在的key一直访问时,就会引起缓存穿透。一般都是恶意攻击!

1.2解决方法:

那面对这样的恶意攻击,我们有没有解决办法呢?

BloomFilter:布隆过滤器

布隆过滤器可以有效的过滤掉一些不存在的key,那么它的原理又是怎样的呢?

布隆过滤器的基本思想:

想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。
链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。
不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。

布隆过滤器的实现:

对一个key进行k个不同hash算法获取k个值,在比特数组中将这k个值在数组中的下标置为1,查的时候如果某个key的在数组中k个位置都为1,那么布隆过滤器判断该key可能存在(并不一定存在)。
布隆过滤器可能会误判,如果它说不存在那肯定不存在,如果它说存在,那数据有可能实际不存在.

二、缓存击穿

2.1概述:

大量的用户请求某一个数据,而此数据在缓存中尚未存在或者过期,则大量的请求会直接请求数据库,好比微博热搜一样,大量的请求瞬间的访问可能会导致缓存被击穿,出现缓存击穿现象

2.2解决办法:

  • 可以将热点数据设置为永远不过期;
  • 可以使用分布式锁,当在缓存中拿不到数据时,使用分布式锁去数据库中拿到数据后,重新设置到缓存;
  • 设置一个定时的维护任务,在key快要过期时,重新设置时间

三、缓存雪崩

3.1概述:

类似于缓存击穿,但又有些不一样
缓存雪崩是大范围的,缓存数据库失效,大量请求直接咂向数据库,导致雪崩
比如:双11期间,一个小时的抢购时间,0:00——1:00,当时间过了之后,缓存设置的时间也随之过期,而此时大量的请求就会直接砸向数据库,导致雪崩;
或者是某台缓存服务器宕机,也有可能发生这种情况

3.2解决方法:

  • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  • 设置热点数据永远不过期。

你可能感兴趣的:(java,数据库)