0、概述
最近在复习redis的时候,发现对redis的一些概念很模糊,今天来梳理一下缓存穿透,缓存击穿,缓存雪崩这三个概念。
1、缓存穿透
概念:所谓的缓存穿透,简单来讲就是查询某些不存在的key时,缓存和数据库查询结果都为空,而空的结果又不被缓存起来,而导致每次查询都去请求数据库层的情况。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
解决方案:常见的两种方法是缓存空数据和使用布隆过滤器。
1.缓存空数据
当第一次查询数据库时,若数据不存在,返回空数据时将其写入缓存,后续查询就不必再去查询数据库了。
2.布隆过滤器拦截
访问缓存之前,先从布隆过滤器中验证数据是否存在。将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
2、缓存击穿
概念:是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。和“缓存雪崩”的区别在于这里针对某一key缓存,后者则是很多key。
解决方案:1.使用互斥锁
2.将一些热点key设置成永不过期
3、缓存雪崩
概念:缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。
解决方案:在每个缓存的过期时间加上一个随机时间,从而使得每个key的缓存失效时间分散开,不让它们在同一时刻失效。