缓存穿透:要访问的数据在数据库中不存在,因此也不会被加到缓存中,因此每次访问都要去数据库中查找数据;
解决:将不存在的数据也加到缓存中,设置一个较短的过期时间;
将一些不可能存在的数据提前过滤掉;
缓存雪崩 :缓存中的数据在同一时间段集体过期:可能是缓存服务器宕机,大量请求直接访问数据库
解决:设置多级缓存,缓存和缓存的拷贝;设置mutex锁,控制访问数据库写缓存为单线程;
根据不同点设置不同的缓存过期时间,热点数据缓存时间长,冷门数据缓存时间短;
缓存预热;
缓存击穿:过于热点的数据,在缓存过期的瞬间,数据库会被过量访问,导致不可用。
解决:可以设置缓存永不过期;
如何保证缓存和数据库中一致:
现在流行解决方法:CAP (cache aside pattern)
1. 请求先查缓存,缓存没有去数据库查,查到之后添加到缓存;
2. 数据更新,先更新数据库,然后删除相应的缓存;
问题:第二步设置缓存失效,不是直接添加到缓存中?
如果线程A和线程B同时更新数据库,B后更新覆盖A,A后添加到缓存覆盖B,这样数据库保存B,缓存保存的是A导致不一致问题出现;
问题:为什么不先删缓存再更新数据?
如果采用这种方式:线程AB同时更新数据,AB都删除缓存,然后A先更新B后更新,A更新完数据后,C查询相关数据,缓存没有,去数据库查到A的更新,然后添加到缓存中;之后B对数据进行更新,导致数据库存B,缓存是A;