【数据存储】【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);
}
相关文章
-
三星手机重置后如何恢复原来数据
-
糟糕的售后服务正在损害苹果在印度的形象
-
从“阿里前美女高管”投身微商谈起
-
iPhone降价销量暴涨,苹果再夺全球市值之冠
-
开局一把“屠龙刀”,熊猫直播没玩好,倒闭都是王思聪的错?
-
8点1氪 | 腾讯云前三季度收入逾60亿;Uber第三季度净亏9.39亿美元;比特币大跌近10%
-
镜头和笔触间的青年力量——媒体视角下的河南共青团
-
搞科研不算偷;大疆损失10亿;牛津大学暂停接受华为捐款
-
标点符号误用18例,从此告别标点符号错误
-
学中国经验,反科技殖民,印度制造BAT
-
春节红包大作战:百度成赢家,苏宁最良心,拼多多套路深
-
小米尬舞:海外互联网服务变现受阻,难逃硬件公司质疑
-
阿里云十周年,第一款NPU下半年发布,20亿补贴小程序生态
-
前腾讯AILab总经理创业打造“吃鸡”AI:能跑毒也能掩护队友打药
-
华为发布首款折叠屏手机MateX:售价约1.75万人民币;亚马逊一货机海湾坠毁,机上人员或全部遇难;微博回应明星账号流量造假:已调整计数规则
-
Facebook的智能聊天设备「扑街」了,但它背后的AI不容小觑
-
联合国电商周分享阿里经验,非洲版“马云”们成了主角
-
无印良品第十次降价谋翻身,中国消费者为何不再“买账”?
-
微软推出全新Office图标
-
创企Mimesys推出AR视频通话应用,英特尔RealSense捕捉+M
-
三寸数码证件照尺寸要求是什么?手机轻松拍照制作
-
小米年会雷军C位献舞:造型满分 节奏慢半拍
-
微信要收钱了?有两项功能实行收费,爱看订阅号、用红包的留意
-
“带着用户一起创新”的布谷BUGU能否引领互联网家电行业创变?
-
微软、Slack“云”上开战,巨头厮杀下谁能抢得更多奶酪?
-
对话OPPO副总裁沈义人:R系列停止更新,Reno接棒领跑下一个十年
-
快手,一个慢公司的远征
-
深度资讯|微信将推信用付产品,PK花呗和白条有多少胜算?
-
字节跳动卖车特斯拉第二工厂选址不实|封面天天见·封火轮