15

面试官: 讲一下缓存穿透、缓存雪崩和缓存击穿?

 3 years ago
source link: https://xie.infoq.cn/article/a36e3d7a896d5fecfaa26eca9
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

原创首发公众号:「bigsai」

缓存穿透、缓存雪崩和缓存击穿

如果不了解,可能对这几个概念都不了解,听着感觉太高大上,至少笔者刚开始是这么觉得,本文并不是详细介绍如何解决和完美解决,更主要的是认识和认知吧。

VzYV3q.png!mobile

3imuuqF.png!mobile

redis缓存穿透

aUZziqR.png!mobile

理解

  • 重在 穿透 吧,也就是访问透过redis直接经过mysql,通常是一个不存在的 key ,在数据库查询为 null 。每次请求落在数据库、并且高并发。数据库扛不住会挂掉。

解决方案

  • 可以将查到的null设成该key的缓存对象。

  • 当然,也可以根据明显错误的key在逻辑层就就行 验证

  • 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。

  • 其他等等,比如用布隆过滤器(超大型hashmap)先过滤。

redis缓存雪崩

理解

  • 雪崩,就是某 东西蜂拥而至 的意思,像雪崩一样。在这里,就是redis缓存集体 大规模集体失效 ,在高并发情况下突然使得key大规模访问mysql,使得数据库崩掉。可以想象下国家 人口老年化 。以后那天人集中在70-80岁,就没人干活了。国家劳动力就造成压力。

m2A7N3q.png!mobile

解决方案

  • 通常的解决方案是将key的过期时间后面加上一个 随机数 ,让key均匀的失效。

  • 考虑用队列或者锁让程序执行在压力范围之内,当然这种方案可能会影响并发量。

  • 热点数据可以考虑不失效

redis缓存击穿

理解

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,好像蛮力击穿一样。

BfeY3eu.png!mobile

  • 击穿和穿透不同,穿透的意思是想法 绕过 redis去使得数据库崩掉。而击穿你可以理解为 正面刚 击穿,这种通常为大量并发对一个key进行大规模的读写操作。这个key在缓存失效期间大量请求数据库,对数据库造成太大压力使得数据库崩掉。就 比如 在秒杀场景下10000块钱的mac和100块的mac这个100块的那个订单肯定会被抢到爆,不断的请求(当然具体秒杀有自己处理方式这里只是举个例子)。所以缓存击穿就是针对某个常用key大量请求导致数据库崩溃。

解决方案

  • 可以使用互斥锁避免大量请求同时落到db。

  • 布隆过滤器,判断某个容器是否在集合中

  • 可以将缓存设置永不过期(适合部分情况)

  • 做好熔断、降级,防止系统崩溃。

下篇文章会讲解redis缓存与关系数据库数据一致性各种场景分析,敬请期待。

Ib6ZR3J.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK