缓存

缓存穿透

顾名思义:就像是【永远越过了缓存而直接访问数据库】。如果缓存中数据不存在,则查询数据库。如果每次都访问不存在的数据,则每次都访问数据库。 如果恶意查询不存在的数据,则极有可能压垮数据库,这个过程称为缓存穿透

业界通用的解决方案
当查询数据库时如果没有查询到数据,则将Null返回给前端用户,同时将Null数据写入缓存,并对对应的key设置一定的过期时间,流程结束。
这种方案一定程度上可以减轻数据库被频繁查询的压力。

缓存雪崩

在某个时间点,缓存中的Key集体过期失效,导致大量查询数据的请求都落在了数据库上,导致数据库负载过高,压力暴增,甚至有可能压垮数据库。

解决方案
这种问题产生的原因主要时大量的Key在某个时间点或者某个时间段过期失效,所以为了更好的避免这种情况的发生,一般的做法时为这些key设置不同的/随机的TTL,从而错开缓存中Key的失效时间,可以在某种程度上减轻数据库的查询压力。

缓存击穿

指的是缓存中某个频繁被访问的Key(热点Key),在不停的扛着前端的高并发请求,当这个key突然在某个瞬间过期失效,持续的高并发访问请求就穿破缓存,直接访问数据库,导致数据库压力在一瞬间暴增。

解决方案
这种现象就像是【在一张薄纸上戳了一个洞】。这种问题产生的主要原因是热点key过期失效了。在实际情况下,既然这个key可以被当作热点数据频繁访问,那么就应该设置这个key永不过期,这样前端的高并发请求将几乎永远不会落在数据库上。

总结
不管是缓存穿透/缓存雪崩/缓存击穿,其实他们最终导致的后果是一致的。即给数据库造成压力,甚至压垮数据库。他们的解决方案有一个共性,那就是加强防线,尽量让高并发请求落在缓存中,避免他们直接跟数据库打交道。

posted @ 2020-09-06 07:31  江湖一笑  阅读(177)  评论(0编辑  收藏  举报