我在之前的博客中提到过——缓存并发,当一个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分布式锁的写法可参考本人上一篇博客,谢谢!