10.redisson的使用
导入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.5</version>
</dependency>
创建配置类
package com.woniu.config;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissConfig {
@Bean
public RedissonClient redisson(){
//单机模式
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
return Redisson.create(config);
}
//集群模式
@Bean
public RedissonClient redisson(){
Config config = new Config();
//哨兵集群模式
//config.useSentinelServers();
//分片集群模式
config.useClusterServers().addNodeAddress("redis://127.0.0.1:6379","redis://127.0.0.1:7001");
return Redisson.create(config);
}
}
代码实现
@Autowired
private RedissonClient redisson;
RLock lock = redisson.getLock("key");
try {
//加锁
//20: 若该线程第一次没有获取到锁,那么20秒内会 每隔 20/3 的时间尝试获取锁,直到20s过后才走到下一行代码
//5: 线程重入时间(自旋时间)
boolean result = lock.tryLock(20, 5, TimeUnit.SECONDS);
//boolean result = lock.tryLock(); 若使用无参方法,若该线程第一次没有获取到锁,直接走到下一行代码,默认锁时间30s
if(!result){
System.out.println("没有抢到锁!");
return;
}
//======业务代码==================
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//判断当前线程有没有加上锁(只有加上锁,才能释放锁,不然会报错),和是不是当前线程持有的锁
if(lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock(); //释放锁
}
}
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/18903219