建立缓存,防高并发代码demo
落日畅想 2018-08-28 11:29:50 浏览56 评论0- 分布式
- java
- 线程
- 数据库
- 高并发
- string
- class
- demo
摘要: 我在之前的博客中提到过——缓存并发,当一个key过期时,访问这个key的请求量过大,穿透到数据库.解决办法:1,分布式锁,保证每个key同时只有一个线程去查询数据库,其他线程没有获得分布式锁的权限,只需要等待.
我在之前的博客中提到过——缓存并发,当一个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分布式锁的写法可参考本人上一篇博客,谢谢!
用云栖社区APP,舒服~
【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入! 详情请点击- 分享到: