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

436 阅读1分钟

本文主要介绍redis三个概念,旨在明白概念,才能想出对应解决方案。

缓存穿透

缓存和数据库中都没有的数据,这样每次请求都会去查库,不会查缓存,如果同一时间有大量请求进来的话,就会给数据库造成巨大的查询压力,甚至击垮db系统

  • 解决思路
    • 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

缓存击穿

一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库;当发生缓存击穿的时候,数据库的查询压力会倍增,导致大量的请求阻塞。

缓存雪崩

缓存中大批量的数据同时过期,巨大的请求量直接落到db层,引起db压力过大甚至宕机。

  • 解决思路
    • 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

    • 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

    • 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。