Redis缓存穿透和缓存雪崩
Redis缓存穿透和缓存雪崩
什么是缓存穿透?
当用户想要查找一个数据的时候,发现在Redis中没有查询到(没有命中缓存),于是就会向持久层数据库去查询数据。结果在持久层也没有查询到该数据。当很多用户都查询数据的时候,由于在Redis缓存中不存在该数据,所以都指向了持久层数据库去查询,这就给持久层数据库造成了非常大的压力,这种情况我们就叫做缓存穿透。(是指在缓存和数据库中都查询不到)
注意:
区别于缓存击穿。缓存击穿是指一个热点key,大并发集中对这个key进行访问,当这个key在失效的瞬间,仍然有大批量的访问这个key,但是由于这个key已经失效,所有的请求就都会直接向持久层数据库进行访问。这种情况就是缓存击穿,和缓存穿透还是有一定区别的。
缓存穿透的解决方案:
- 1、使用布隆过滤器进行过滤
将所有存在的数据哈希到bitmap中,如果访问的不存在,则会被bitmap拦截掉,从而保证不会对持久层进行查询。 - 2、如果查询的数据不存在,则也对这个数据进行缓存(缓存为空)。
什么是缓存雪崩?
缓存雪崩是指缓存层本身出现了问题,比如:缓存层宕机,或者缓存数据在同一时间过期。那么所有的查询请求都会指向数据库。这种情况我们称之为缓存雪崩。
缓存雪崩解决方案:
- 1、搭建Redis集群,保证Redis提供正常的服务。
- 2、给数据设置不同的过期时间。
缓存穿透和缓存雪崩以及缓存击穿的区别:
- 缓存穿透:访问的数据在缓存和数据库中都不存在。
- 缓存击穿:热点key在突然失效导致所有请求都指向服数据库。
- 缓存雪崩:缓存不可用或所有数据同一时间失效造成所有请求都指向了数据库。