所有这些缓存的问题都是因为为使用缓存查询数据而导致的对数据库造成的瞬间压力
使用缓存带来的影响
以为牺牲数据一致性为代价换来了更大的并发量
缓存穿透
顾名思义,穿透的意思是缓存层永远不起作用。
缓存相关的请求,我们的操作流程一般为:
1 查询缓存中是否存在这一条数据
2 如果不存在则查询数据库
3 如果数据库中存在这一条数据,则将数据刷新到缓存中,如果不存在则不做操作
从上面的流程中我们可以看出:
想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。
解决策略:
将这条一定不存在的数据也缓存到数据库中,但是因为这条数据没有实际意义,因此要把他的过期时间设置得短一些(如60s)
缓存雪崩
顾名思义,雪崩意思是大量缓存失效。缓存是有失效的时间的。如果大量缓存在同一个时间同时失效,那么会导致数据库压力急剧上升。如果缓存失效的时间是相同的,那么数据库的压力成周期性变化。
解决策略:
将不同的数据的缓存失效的时间设置为不同的(加随机因子,将数据分类)
缓存击穿
顾名思义,雪崩意思是针对单个缓存。当一个缓存的数据在失效时突然面对大量并发,这时大量的请求会请求到数据库,因此发生缓存击穿。
解决策略:
预先将热点数据设置为永久缓存