一、缓存架构图
(1)在没有引入缓存的时候,我们请求的数据都是上数据库直接查询了。
(2)引入缓存之后,我们在获取数据时会先去缓存看看有没有缓存数据,有直接返回,没有上数据库进行查询,然后设置到缓存中,再进行返回。
(3)并不是所有的数据都要放到缓存中了:访问频率低的、读少写多的、一致性要求高的,这些就不要缓存了。
二、缓存穿透、击穿、雪崩
2.1 缓存穿透
师傅:纳尼,不是做缓存了,怎么还一直请求到数据库?
悟纤:你不会告诉我这就是缓存穿透吧?
师傅:是的,这就是缓存穿透造成的结果。
师傅:我们先来看下缓存穿透的定义吧,如下:
缓存穿透:在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接落到数据库上,如活动系统里面查询一个不存在的活动。
师傅:这个名词取的多形象呐,缓存穿透。
师傅:你从何而来,要到到何处,从缓存过来,到数据库去。直接从缓存穿、透过去了,有点是绕开了缓存的意思。
悟纤:师傅这是一语道破天机呐。
师傅:简单说就是,
缓存穿透:请求未命中缓存,直接到数据库,这就是缓存穿透。比如:查询一个不存在的值的时候,如发起为id为“-1”的数据或id为特别大不存在的数据
师傅:明白了,一箭穿心,就是直接从缓存系统传过去,透到数据库,就是缓存穿透。
2.2 缓存击穿
师傅:理解了缓存击穿,接下来咱们来讲缓存击穿,注意这两个差别。
师傅:缓存穿透是查询一个不存在的数据,导致每次都打到数据库上了。缓存击穿,是确实在缓存有数据,我很用心的给你传了一个活动id = 666的。
悟纤:那怎么还会有问题呐?这不是很好嘛,每次请求都命中缓存了,使用率很高耶。
师傅:师傅,徒儿你还是太嫩了,还得在吃几年草。
悟纤:师傅,你又逗徒儿开心了,我不是你的小宝贝嘛。
师傅:(*^▽^*) , 你想想缓存是有失效时间的吧,那么如果缓存刚好到期了,而此时有一万个麒麟臂向你扑面而来,哦,不,是有大量请求过来,直接打到了数据库。看看定义吧:
缓存击穿:缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
师傅:一般这样的key都是热点key,玩过秒杀,秒杀中的key就是热点key。
悟纤:师傅我懂了,就是热点key在高并发下刚好过期了,这些秒级请求直接打到数据库,如果数据库处理不过来,那就挂了。
师傅:嗯嗯,很对,所以缓存击穿简单理解就是:
缓存击穿:热点key,缓存过期,直击数据库。比如:秒杀活动的时候,大量用户进行抢购某个商品,而此时刚好key过期了,那么这些请求就直接命中到数据库了。
师傅:我们在来从词理解下这个意思。你看缓存击穿,何谓击穿,不就是有一个东西顶着,然后没顶住,就穿过去了嘛。请求击倒缓存,缓存碰巧开小差了下,就穿到数据库了。
2.3 缓存雪崩
师傅:我们先理解下雪崩的意思,大量雪体崩塌,这种自然想象就是雪崩。
悟纤:这个我也知道,那和我们的缓存有什么关系呢。
师傅:你看,大量雪对应缓存中的就是大量的key,崩塌就是缓存过期失效了,这就造成缓存雪崩了,直接请求到数据库了,同样的我们看下定义。
。。。。。。。。。。。。。。。。。
版权原因,完整文章,请参考如下:一分钟get:缓存穿透、缓存击穿、缓存雪崩 - 第304篇