【数据存储】【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);
}
相关文章
-
神舟电脑大战京东的背后,中小企业的电商之路如何破局?
-
常德发改读书会来了|第1期:做未来时空的穿越者
-
ps2020安装教程Windows系统AdobePhotoshopCC2020
-
在VR/AR上加快步伐的华为,开发者应该如何把握机会?
-
复刻人人网的 app 来了,但我们建议你不要注册
-
996事件的启示:我们终将忙碌到精疲力尽
-
氪星晚报 | 瑞幸咖啡或正加快赴港IPO;红黄蓝针对虐童案件发表声明;腾讯15款热门游戏启用健康系统
-
深度:丑闻缠身过后,YouTube的自我救赎
-
2020春晚红包大战:短视频成数字化“基建狂魔”
-
恶意注册账号亟待治理,政企研各界共同为黑产治理开药方
-
张颐武:对外传播需更自信和从容
-
【虎嗅早报】格力放出举报奥克斯证据;市场监管总局:正调查核实格力举报奥克斯事件
-
京东拍拍王永良:建标准、做产品是二手电商的核心|WISE 2018新经济之王
-
退税不用排长队,「Wevat」提供一站式英国自助退税服务
-
焦点分析|把直播放进微信后,腾讯想通过带货和朋友圈广告赚钱
-
技术与工具|语料格式转换工具合集
-
ofo给还在路上垂死挣扎的战友们留下什么启示?
-
亚马逊「黑五」卖得很好,「网络星期一」也要来了
-
Facebook内部研究显示:3.6亿用户沉迷其中无法自拔
-
微信群里发红包指定人领取怎么弄
-
搜狗财报转亏硬件战略加重营收负担
-
“现场求偶高质量女主播”人类高质量男性官宣首播,女粉狂喊老公
-
996.ICU掀起互联网的“遮羞布”
-
热点|Facebook在俄罗斯被罚47美元
-
热点丨法拉第未来:数百名休假员工暂时无法重返工作岗位
-
周鸿祎:我和老齐都挺好
-
绘图教程:简洁且高级的「细胞结构+信号通路」,看这一篇就够了!
-
2018京东“双十一”累计下单金额达1598亿 同比增长25.7%
-
【重磅】阿里云变阵阿里云智能,换帅行巅!与腾讯、华为三云争霸