我在之前的部落格中提到過——緩存并發,當一個key過期時,通路這個key的請求量過大,穿透到資料庫.解決辦法:1,分布式鎖,保證每個key同時隻有一個線程去查詢資料庫,其他線程沒有獲得分布式鎖的權限,隻需要等待.具體實作如下
@Override
public AppUser findById(Long id) {
if (redisService.exists("user:" + id)) {
String appUserStr = redisService.get("user:" + id);
return JSONObject.parseObject(appUserStr,AppUser.class);
} else {
//擷取分布式鎖
if (RedisTool.tryGetDistributedLock(redisService,"useridlock:" + id,Long.toString(id),180)) {
AppUser appUser = appUserDao.findById(id);
redisService.set("user:" + id, JSONObject.toJSONString(appUser));
redisService.expire("user:" + id, 864000);
//釋放分布式鎖
RedisTool.releaseDistributedLock(redisService,"useridlock:" + id,Long.toString(id));
return appUser;
} else { //無獲得分布式鎖權限時
try { //目前線程休眠1秒,可根據适當情況調整這個休眠時間
Thread.currentThread().sleep(1000);
if (redisService.exists("user:" + id)) {
String appUserStr = redisService.get("user:" + id);
return JSONObject.parseObject(appUserStr,AppUser.class);
}else {
return null;
}
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
}
}
Redis分布式鎖的寫法可參考本人上一篇部落格,謝謝!