概念:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
public Stringget(key){
String value = redis.get(key);
//代表缓存值过期
if (value ==null) {
// 获取锁
if (redis.add(lock_key)) {
//代表add成功
value = db.get(key);
redis.set(key, value, expire_secs);
}else {
//这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
sleep(50);
//重试
get(key);
}
}else {
return value;
}
}
lock_key:防止死锁,设置3s有效期