Redis缓存穿透、缓存雪崩和缓存击穿详解与解决方案

缓存穿透

        正常的使用缓存流程是先去缓存查询数据,如果差不多数据,再去数据库查询,并把查询到的数据放进缓存,如果数据库也查不到数据,则不放进缓存。 缓存穿透是指查询一个数据库不存在的数据,永远都不会命中缓存,举个例子:数据库表里只有id为1-1000的数据,而请求查询的id是1001,返回的值一定是null,所以不会对这个空值进行缓存,这就失去了缓存的意义,一般这种情况都是恶意的攻击

 解决方案:

1、可以在服务端判断请求的key在数据库中不存在时,默认在redis中添加一个有效期比较短的空值缓存,下次请求进来时直接返回缓存中的空值

2、使用布隆过滤器,它可以将所有可能存在的数据hash后穿冲到一个bitMap中,当请求进来的时候,先通过布隆过滤器判断key是否存在,然后将可能不存在的数据进行拦截,防止大量可能不存在的值去请求数据库

缓存雪崩

        缓存雪崩就是缓存的大量数据在同一时间失效,大量请求去访问数据库,对数据库造成巨大压力甚至直接宕机

解决方案:

1、可以对进行缓存的数据设置随机的过期时间,避免在同一时间失效

2、设置过期时间比缓存标记时间延长1倍,比如缓存的时间为30分钟,数据库缓存设置成60分钟,当缓存标记的key过期后,实际还能返回旧数据,知道另外的线程在后台更新完成后,才返回新的缓存数据

缓存击穿

缓存击穿是指一个key非常热点,大量并发请求集中对这一个点进行访问,当这个key在失效的瞬间,持续的大量并发请求就会去请求数据库,对数据库造成过大的压力

解决方案:

1、可以设置key为永久不过期

2、使用互斥锁,也就是在缓存失效的时候,第一个线程获取锁,然后去数据库访问,后面的线程在第一个线程没释放锁之前等待,直到第一个线程完成,后面的线程重新尝试在缓存中获取数据

 

你可能感兴趣的:(Redis,redis)