天天看點

建立緩存,防高并發代碼demo

我在之前的部落格中提到過——緩存并發,當一個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分布式鎖的寫法可參考本人上一篇部落格,謝謝!