Redis击穿、穿透、雪崩产生原因以及解决思路
时间:2021-11-03 14:19:37
手机看文章
扫描二维码
随时随地手机看文章
[导读]作者:等不到的口琴来源:www.cnblogs.com/Courage129/p/14348720.html击穿大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需...
为什么会有击穿发生呢?
有两个主要原因:
Key被页面置换淘汰
应对击穿的处理思路
正常的处理请求如图:
-
请求到达Redis,发现Redis Key过期,查看有没有锁,没有锁的话回到队列后面排队
-
设置锁,注意,这儿应该是setnx(),而不是set(),因为可能有其他线程已经设置锁了
-
获取锁,拿到锁了就去数据库取数据,请求返回后释放锁。
穿透
穿透主要原因是很多请求都在访问数据库不存在的数据,例如一个卖书的商城一直被请求查询茶叶产品,由于Redis缓存主要是用来缓存热点数据,对于数据库都不存在的数据,是没法缓存的,这种异常流量就会直接到达数据库并且返回"没有"的查询结果。
雪崩
雪崩,和击穿类似,不同的是击穿是一个热点Key某时刻失效,而雪崩是大量的热点Key在一瞬间失效,网络上很多博客都在强调解决雪崩的策略是随机过期时间,这个非常不准确,举个例子,银行做活动,之前这个利息系数为2%,过了零点系数改为3%,这种情况能将用户的对应的key改为随机过期吗?如果用的过去的数据叫脏数据。