【数据存储】【Redis】高并发下实现分布式锁
原标题:【数据存储】【Redis】高并发下实现分布式锁
大部分互联网公司实现分布式锁原理
/**
* 分布式锁底层实现原理
* @return
*/
@GetMapping("distributedLock")
public Object distributedLock(){
String lockKey = "distributedLockKey";
//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁
String clientId = UUID.randomUUID().toString();
try {
//添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在
Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
if (!result) {
return "error_code";
}
// Todo 实现业务逻辑
redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));
} finally {
//判断是不是自己的线程删除自己的锁
if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {
redisTemplate.delete(lockKey);
}
}
//Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。
return "end";
}
/**
* 分布式锁底层实现原理
* @return
*/
@GetMapping("distributedLock")
public Object distributedLock(){
String lockKey = "distributedLockKey";
//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁
String clientId = UUID.randomUUID().toString();
try {
//添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在
Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
if (!result) {
return "error_code";
}
// Todo 实现业务逻辑
redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));
} finally {
//判断是不是自己的线程删除自己的锁
if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {
redisTemplate.delete(lockKey);
}
}
//Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。
return "end";
}
基于redisson实现高并发分布式锁
引入依赖:
org.redisson
redisson
3.6.5
启动类中注入bean对象:
@Bean
public Redisson redisson() {
// 此为单机模式
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);
return (Redisson) Redisson.create(config);
}
@Bean
public Redisson redisson() {
// 此为单机模式
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);
return (Redisson) Redisson.create(config);
}
实现分布式:
@Autowired
RedisTemplate redisTemplate;
@Autowired
private Redisson redisson;
/**
* 基于redisson实现高并发分布式锁
* @return
*/
@GetMapping("highConcurrencyDistributedLock")
public Object highConcurrencyDistributedLock(){
RLock redissonLock = redisson.getLock(TestConstant.HIGH_CONCURRENCY_DISTRIBUTED_LOCK);
try {
//加锁,实现了key设置,过期时间,锁续命功能
redissonLock.lock(); //redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
// Todo 实现业务逻辑
redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));
} finally {
//释放锁
redissonLock.unlock();
}
return redisTemplate.opsForValue().get(TestConstant.KEY_TEST);
}
@Autowired
RedisTemplate redisTemplate;
@Autowired
private Redisson redisson;
/**
* 基于redisson实现高并发分布式锁
* @return
*/
@GetMapping("highConcurrencyDistributedLock")
public Object highConcurrencyDistributedLock(){
RLock redissonLock = redisson.getLock(TestConstant.HIGH_CONCURRENCY_DISTRIBUTED_LOCK);
try {
//加锁,实现了key设置,过期时间,锁续命功能
redissonLock.lock(); //redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
// Todo 实现业务逻辑
redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));
} finally {
//释放锁
redissonLock.unlock();
}
return redisTemplate.opsForValue().get(TestConstant.KEY_TEST);
}
相关文章
-
涉爆案件刑侦专家、桥梁建筑女焊工,他们是新时代的平凡英雄
-
拥有7300万用户的趣步被查!不要再被类似传销“割韭菜”了
-
智能图形计算前沿进展与应用讲习班11月17日杭州举办
-
百度获得春晚流量加持后,或能重返BAT第一梯队?
-
短视频与音乐的碰撞蕴藏着什么商机?
-
手机还是那个手机微信、淘宝、抖音等要互相打通了
-
看小说就用它!海量精品小说,统统免费看
-
最前线|AppleCard正式上线,最高3%的返现归根结底是为留住用户
-
百度申请“用于检测恶意代码方法和系统”专利获授权
-
借呗和花呗有什么区别啊
-
法拉第未来因严峻现金流危机不得不让更多员工停薪留职
-
9位世界级AI科学家加盟百度,释放了什么信号?
-
阅文恳谈会:著作人身权归属作者,免/付费模式由作者选择
-
【钛晨报】支付宝回应年度账单金额过高:增加了投资理财等;腾讯回应手机QQ可显示对方实时电量:隐私不会泄漏
-
大众汽车将投资90亿美元整合其研发部门
-
普通段位职场人如何变身星耀王者?这个大招一定要掌握
-
节节败退,母婴社区能否成母婴电商最后的护城河?
-
PayPal宣布退出Libra:继续就未来合作方式进行对话
-
苹果高管:公司与FDA关系不错但审查严格
-
焦点分析|上线电商小程序,抖音不甘心只为他人“做嫁衣”
-
滴滴网约车自杀事件反思,市场的不规范不能仅靠媒体监督解决!
-
微信还在删除拉黑!学习知识点二,再也不担心被打扰生活查岗
-
【虎嗅早报】阿里收购网易考拉谈判接近结束?双方回应:不予置评;反击禁令,华为在美展开游说行动
-
脸书隐私案大结局?50亿美元罚金、设隐私委员会、小扎不用辞职
-
在成王败寇以外
-
主动退出还是被迫离开?亚马逊中国官网出现“意外错误”
-
豌豆荚PC版停止服务,第三方应用商店辉煌不再,黑手竟是华米OV?
-
消息称苹果协助立讯精密涉足iPhone制造降低对富士康的依赖
-
西北空管局空管中心技保中心导航室开展线上执照熟练培训