1、基于StringRedisTemplate实现分布式锁
? ??
@Autowired
private RedisLock redisLock;
double money = 0;
@GetMapping("/test")
public String test() throws InterruptedException {
String time = System.currentTimeMillis() + 6000L + "";
boolean test = redisLock.lock("test", time);
if (!test){
return "您的操作太频繁,请稍后再试";
}
try {
log.info("*****************************************");
log.info("*****************************************");
money = money + 1;
Thread.sleep(100);
log.info(">>>>>>>>>>>money【{}】-【{}】", money,
Thread.currentThread().getName());
money = 0;
} catch (Exception e) {
log.info(">>>>>>>>>>>>>>>>>>>>>>>>", e);
} finally {
log.info("*****************************************");
log.info("-----------------------------------------");
redisLock.unlock("test", time);
}
return "成功";
}
在并发量1秒几万情况下,没有碰到并发问题。但是有一个问题,就是关于Redis分布式锁的自旋。当将StringRedisTemplate实现分布式锁改成可以自旋的,在高并发下,却出现了问题。也试过Jedis分布式锁,也同样在自旋的情况下出现打印money不为1的日志。
2、基于Redission实现分布式锁
2.1、添加依赖:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.8.2</version>
</dependency>
? 改成另外一个依赖也可
2.2、添加配置:
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient getClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
return redisson;
}
}
? 当然了,这是redisson 的最基本的配置.
2.3、Redission分布式锁的简单使用
?
@Autowired
private RedissonClient redissonClient;
double money = 0;
@GetMapping("/test")
public String test() throws InterruptedException {
RLock lock = redissonClient.getLock("m");
boolean test = lock.tryLock(2, 8, TimeUnit.SECONDS);
if (!test){
return "您的操作太频繁,请稍后再试";
}
try {
log.info("*****************************************");
log.info("*****************************************");
money = money + 1;
Thread.sleep(100);
log.info(">>>>>>>>>>>money【{}】-【{}】", money, Thread.currentThread().getName());
money = 0;
} catch (Exception e) {
log.info(">>>>>>>>>>>>>>>>", e);
} finally {
log.info("*****************************************");
log.info("-----------------------------------------");
lock.unlock();
}
return "成功";
}
?
? 基于Redission分布式锁在1秒几万情况下,貌似没有碰到上面的问题
|