缓存穿透
概念
在缓存和数据库里均不存在对应的数据, 如果没做拦截的话,可能每次都会从数据库里查。
怎么解决
1、对数据要进行合法性检验,需要有一个白名单,如果不在白名单里,就直接返回。
2、如果这个缓存是全量的,那不在缓存里就直接返回,就不用再查数据表了。
3、每次查库之后即使是空结果也做个缓存,限定下过期时间,比如3分钟过期,这样也会减少一些压力。
4、这类请求不排除人为伪造的可能,如果请求量大的话,可以在服务器里设置黑名单。
缓存击穿
概念
某个key对应的数据访问量极大,而在缓存中又过期了,导致每次都要从库里查。
怎么解决
1、对热点数据不设置过期时间,或者存在过期时间,但后台会对这个数据进行定期更新。
2、从库里取之前,可以加个锁,以尽可能减少对数据库的访问。取到数据之后要及时更新到缓存,采DCL机制,后面的请求就可以从缓存中取了。
缓存雪崩
概念
大量缓存在某一个时间段同时失效,数据又从库里取了。
怎么解决
1、在设置过期时间时,不要设置一个定值,可以有一定的浮动空间,减少同时过期的可能。
2、做好服务的融断降级处理,缓存里没数,查库是必须的,如果不能及时响应,给用户尽可能做些友好提醒。