缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的。每次查询数据的时候,先判断缓存!
解决方案:
另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方案:
缓存的key过期时间可以随机取得!最好不要都设置成统一的过期时间!
缓存击穿
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
解决方案
使用互斥锁!
#redis 3.0以前使用
SETNX
#redis 3.0以后使用
set set key ok px time(ms) nx|px