【数据存储】【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);
}
相关文章
-
比特币增发警示录:修改发行上限的恶果,将是行业崩溃,比特币归零
-
年后想换手机的再等等!这三款骁龙855都是高配低价,望周知
-
爱奇艺CEO:95后00后普遍以看盗版内容为耻
-
阿里组织架构调整,和腾讯的B端之战或将白热化
-
华为兑现出货量2亿承诺,寡头时代中小手机厂商出路何在?
-
上架9秒售空,力压一众外国品牌,这家国产潮玩如何施展魔力
-
一文读懂!企业微信的7个重要功能与实操经验(附总结清单)
-
国产航母进行第三次海试!开展舰载机舰上调度检验!
-
“禧”提星巴克:星巴克开进浙大校园
-
苹果向亚马逊FireTV推出音乐服务,打破软件封闭状态
-
张一鸣自己都不用头条和抖音?官方辟谣来了
-
无惧风雨|有孚网络再现高可靠运维保障
-
思科2020二季度净利润29亿美元,同比增长2%
-
小米年会雷军C位献舞:造型满分 节奏慢半拍
-
没有华为的《财富》中国500强迷局:京东称大王,美团巨亏1155亿
-
假如乔布斯还在世,iPhone「浴霸」摄像头会出现吗?
-
最牛“包工头”要改造100万家餐厅!让这些门店增收四成
-
五大云巨头:亚马逊称霸全球,阿里云能追赶AWS吗?
-
热点|2018年全球移动应用消费支出高达1010亿美元
-
最高售价15299元,苹果发布了全新的全面屏iPad Pro
-
脸书神秘支付项目代号曝光,“ProjectLibra”或将颠覆传统电商
-
【钛晨报】苹果多款产品加征关税至15%;暴风集团冯鑫涉嫌行贿罪、职务侵占罪被批捕;社区电商爱鲜蜂停止访问
-
滴滴否认“数据打包给美国”:数据存在国内服务器,将坚决起诉维权
-
山西200座古建筑正在经历“人类文明最悲痛的一天”
-
唱好“先分期后开卡”的信用卡新模式是妄想狂欢
-
早报|罗永浩或再创业做电子烟/AirPods2将支持快速充电/特斯拉一周降价34万,车主怒了
-
精选头条丨B站跨年晚会“破圈”成功;蔚来财报超预期;联想手机前掌门人入伙小米
-
资讯6点档 | 网络安全高官竟没用过电脑,USB也不知怎么用
-
2022年CIA报考指导-如何创建账户和完善个人信息