Redis缓存知识问题( 二 )

缓存击穿:

条件:对于一些设置了过期时间的key , 如果这些key可能会在某些时间点被超高并发地访问 , 是一种非常“热点”的数据 。 这个时候 , 需要考虑一个问题:缓存被“击穿”的问题 , 这个和缓存雪崩的区别在于这里针对某一key缓存 , 前者则是很多key 。

缓存在某个时间点过期的时候 , 恰好在这个时间点对这个Key有大量的并发请求过来 , 这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存 , 这个时候大并发的请求可能会瞬间把后端DB压垮

解决方案:

使用互斥锁(mutex key)

业界比较常用的做法 , 是使用mutex 。 简单地来说 , 就是在缓存失效的时候(判断拿出来的值为空) , 不是立即去load db , 而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key , 当操作返回成功时 , 再进行load db的操作并回设缓存;否则 , 就重试整个get缓存的方法 。

推荐阅读