Redis缓存穿透、雪崩、击穿的解决方案

在大型业务系统或用户活跃量较大的环境中,用户往往对某些数据的访问量会非常大,为了保护数据库而引入了缓存Redis,但是其也会出现一些问题,而导致严重的后果,比如缓存穿透、缓存雪崩、缓存击穿,下面我将针对这几个问题给出解决方案。

1.缓存穿透

缓存穿透发生的原因就是“用户”访问一个缓存中不存在,数据库中也不存在的数据。当这种请求量非常大时,就会对数据库造成非常大的压力。

为了解决这个问题,通常有两种解决方案。

   1.存储空值:当访问一个不存在的值的时候,可以在缓存中设置一个对应key的空键值对,以后这种请求都会 打在缓存上,但是同样要给这个空值设置一个短的TTL(过期时间)。

   2.布隆过滤器:布隆过滤器可以很好的判断一个值是否在数据库中存在。布隆过滤器主要是采用几个不同的 hsah算法对访问的数据进行匹配,将hsahcode映射在一串二进制比特位上,命中的位置将0改为1。当访问 一个数据时,首先判断其对应bit位上是否为1,若不全为1,则判断不存在。但是会有一个缺点,当一个不 存在的数据其对应bit位全被其他元素改为1后,也会被判断存在,虽然这种概率比较低。所以布隆过滤器 可 以判断为不存在元素一定是不存在的,但是判断为存在的元素也不一定存在。

2.缓存雪崩

  造成缓存雪崩产生一般有两种原因。

  第一种就是缓存中的数据大量失效,导致大量的请求打到数据库上,给数据库造成巨大的压力。

  第二种是redis宕机,导致请求大量打在数据库上。

  解决的方法有以下几种:

  1.给热点数据设置不同的过期时间,防止数据大量失效。

  2.部署redis集群,防止单节点宕机导致redis不可用,保证Redis的高可用。

  3.设置多级缓存,比如增加本地缓存,提高服务的可用性。

  4.增加服务降级策略,当请求量对数据库压力过大时,可以考虑拒绝一部分请求或者暂停某一块服务。

3.缓存击穿

  缓存击穿产生的原因就是某一热点数据突然过期,同时有大量的查询请求进来,导致的数据库压力。

  要解决缓存击穿有两种方法:

  1.加互斥锁:当一个请求线程发现数据不存在,就要对这个数据进行缓存重建,并且获取一把锁。当其他请求对该数据进行访问时,同样要来重建,则会不停地等待,直到重建完成。然后可以查到新数据返回。

  2.逻辑过期:与第一种方法不同的是,第一个发现数据不存在的线程,会调用一个新的线程去执行重建操作,自己以及其他这段时间内进来的请求会带着旧数据返回。在缓存重建完成后,再进来的请求可以查 询到新数据。

  3.热点数据设置永不过期:缓存击穿的根本原因就是数据过期,我们可以直接对热点数据设置永不过期,这也避免了因为过期而导致的问题。

你可能感兴趣的:(缓存,redis,数据库,java,spring,cloud,intellij-idea)