Redis的缓存穿透、缓存击穿和缓存雪崩
正常业务下,从数据库查询出的数据可以保存在Redis中,下次查询时直接从Redis中获得,大幅提高响应速度,提高系统性能。
1. 缓存穿透
所谓缓存穿透,就是查询了一个Redis和数据库中都不存在的数据。我们Redis中没有这个数据,它到数据库查,也没有如果这样的请求多了,那么数据库压力就会很大,虽然向Redis中保存null值,可以防止一个查询反复穿透,但是这样的策略有问题,如果用户不断更换查询关键字,反复穿透,也是对数据库性能极大的威胁。
使用布隆过滤器来解决这个问题
事先创建好布隆过滤器,它可以在进入业务逻辑层时判断用户查询的信息数据库中是否存在,如果不存在于数据库中,直接终止查询返回。
2. 缓存击穿
正常运行的情况,我们设计的应该在Redis中保存的数据,如果有请求访问到Redis而Redis没有这个数据,导致请求从数据库中查询,这种现象就是缓存击穿。
但是这个情况也不是异常情况,因为我们大多数数据都需要设置过期时间,而过期时间到时这些数据一定会从数据库中同步,击穿只是这个现象的名称,并不是不允许的。
3. 缓存雪崩
上面讲到击穿现象,同一时间发生少量击穿是正常的,但是如果出现同一时间大量击穿现象就是雪崩。
这种情况下,Mysql会短时间出现很多新的查询请求,这样就会发生性能问题
如何避免这样的问题?
因为出现这个问题的原因通常是同时加载的数据设置了相同的有效期,我们需要在设置有效期时添加一个随机数,大量数据就不会同时失效了。
总结:
缓存穿透:Redis和数据库中都不存在。(用布隆过滤器解决)
缓存击穿:Redis中没有,去数据库中查询。(少量击穿属于正常现象)
缓存雪崩:同一时间大量击穿现象。(设置不同的有效期解决)