【数据存储】【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);
}
相关文章
-
票房破23亿,这颗“流浪地球”有魔力
-
【钛晨报】快手组织架构调整,运营和商业化负责人互换岗位;苹果今年将投入190亿美元加码汽车研发;抖音回应AI造芯传闻:信息不实
-
积木云CEO:绝大多数仅宣传TPS的公链,没什么实际用处|链得得吐槽大会
-
Facebook广告投放丨Facebook引流的三种方法
-
特斯拉给员工发布邮件:如果你泄密,我们会抓住你,解雇你,可能会起诉你
-
我国5G网络用户数超1.6亿占全球5G总用户数近九成
-
微信拟推出聊天记录付费云存储服务
-
董明珠赢得了雷军的10亿赌局,却让格力经销商很受伤
-
比特币一度突破7370美元世界第三大加密货币交易所24小时爆仓近亿美元
-
再提私有化,陈欧还在为自己代言,聚美优品已经不美
-
消息称网易考拉合并亚马逊中国海外购业务,网易不予置评
-
苹果提交新证据,以阻止高通在华禁售 iPhone
-
唯品会再造唯品会
-
评论|“阿里离职女高管”风波:一场源起网络流量的闹剧
-
图标统一性要如何检测?来看腾讯设计师总结的自检要素表
-
光明时评:让基层不再望“数”生畏
-
荣耀五年启示录:是什么成就了荣耀?
-
程序员是否应该创造面向 IDE 而非人类的编程语言?
-
猎豹移动产品被谷歌下架:股价跌17%市值降至4亿美元
-
买车比炒股还刺激!“钢铁侠”究竟在下一盘什么大棋?
-
阿里女员工疑遭猥亵、性侵,涉事济南华联员工:被冤枉,正在接受警方调查
-
KYOCERA/AVX京瓷MLCC片式电容器一级代理分销KOYUELEC光与电子
-
当网红们开始尝试内容付费,这对品牌来说意味着什么?
-
工信部这次出手,要把各家App的壁垒打穿了。。。
-
事关10亿用户?支付宝还信用卡要收费,到底是怎么回事?
-
苹果推出“苹果边缘缓存”,帮助互联网企业向用户快速发送内容
-
中芯国际刚刚发布公告!这相当透露了梁孟松的现状
-
小米财报发布在即董明珠又出惊人言论是为碰瓷?
-
前腾讯AILab总经理创业打造“吃鸡”AI:能跑毒也能掩护队友打药