redisson实现分布式锁
1.配置类【以下实现均是本地实现】
package com.springboot.redisdemo.bean;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
/** * @author lhp * @version 1.0 * @date 2021/1/25 14:24 */
@Configuration
public class MyRedissonConfig {
@Bean(destroyMethod="shutdown")
RedissonClient redisson() throws IOException {
//1、创建配置
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379");
return Redisson.create(config);
}
}
- 注意:这里有个问题,setAddress需要加
redis:// 不然初始化的时候会报错。
2.实现
package com.springboot.redisdemo.controller;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
/** * @Author lhp * @Date 2020/8/31 14:49 * @Version 1.0 * @Description */
@Slf4j
@RestController
@RequestMapping("aaa")
public class RedisController {
private static final String KEY = "mylock";
@Autowired
private RedissonClient redissonClient;
@GetMapping("/lock1")
public String testLock1() {
log.info("lock1 正在获取锁。。。。");
RLock lock = redissonClient.getLock(KEY);
lock.lock();
log.info(Thread.currentThread().getName() + ":" + Thread.currentThread().getId() + " lock1 已经获取到锁");
try {
//模拟业务处理20s
log.info("正在进行业务处理");
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();
log.info(Thread.currentThread().getName() + ":" + Thread.currentThread().getId() + " lock1 已解锁");
return "lock1";
}
@GetMapping("/lock2")
public String testLoc2() {
log.info("lock2 正在获取锁。。。。");
RLock lock = redissonClient.getLock(KEY);
lock.lock();
log.info(Thread.currentThread().getName() + ":" + Thread.currentThread().getId() + " lock2 已经获取到锁");
try {
//模拟业务处理20s
log.info("正在进行业务处理");
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();
log.info(Thread.currentThread().getName() + ":" + Thread.currentThread().getId() + " lock2 已解锁");
return "lock2";
}
}
3.测试结果
lock1 的redis key存储,此时是lock1的线程id
lock 2 的key 存储,此时已经更换为lock2的线程id
还没有评论,来说两句吧...