击穿:设置过期时间key,某个时刻批量过期,大亮请求直接落db上。和雪崩区别是雪崩很多key
解决方案
![](https://img.haomeiwen.com/i9930763/e4d0fef3db5b2204.png)
一、用互斥锁(mutex key)
常用做法,用mutex。缓存失效时,不立即load db,先用缓存工具的某些带成功操作返回值的操作(如Redis的SETNX)set一个mutex key,操作返回成功,再load db设缓存;否则重试整个get缓存方法
![](https://img.haomeiwen.com/i9930763/e256164e9560086c.png)
二、"提前"使用互斥锁(mutex key):
value内部设置超时值timeout1, 比实际的memcache timeout2小。从cache读取到timeout1发现它已经过期时,马上延长timeout1并重新设置到cache。再从db加载数据并设置到cache中
![](https://img.haomeiwen.com/i9930763/401e91e013da69fd.png)
三、 "永远不过期"
包含两层意思:
(1) 从redis上看,没设置过期时间,保证不出现热点key过期问题,“物理”不过期
(2) 从功能上看,如不过期,就成静态,所以把过期时间存在key对应value里,发现过期,通异步线程构建缓存,“逻辑”不过期
从实战看,性能非常友好,不足就是构建缓可能访问老数据,一般可忍受
![](https://img.haomeiwen.com/i9930763/98d34163d37feb78.png)
四、资源保护
用netflix的hystrix,做资源隔离保护主线程池,应用到缓存构建
四种解决方案:没有最佳只有最合适
https://blog.csdn.net/zeb_perfect/article/details/54135506
网友评论