redisson简介
Redisson是一个在Redis的基础上实现的Java驻内存数据网格,它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
Redisson作为独立节点 可以用于独立执行其他节点发布到分布式执行服务 和 分布式调度任务服务 里的远程任务
redisson集成
1)引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
2)编写配置文件
server:
port: 8080
spring:
redis:
database: 0
host: localhost
timeout: 10000
port: 6379
password: 123456
lettuce:
pool:
max-wait: -1
max-active: 8
max-idle: 8
min-idle: 0
3)编写配置类
@Data
@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
private String host;
private int port;
private String password;
private int database;
}
@Slf4j
@Configuration
public class RedissionConfig {
@Autowired
private RedisProperties redisProperties;
@Bean
public RedissonClient redissonClient(){
RedissonClient redissonClient;
Config config = new Config();
String url = "redis://" + redisProperties.getHost()
+ ":" + redisProperties.getPort();
config.useSingleServer().setAddress(url) //单机
.setPassword(redisProperties.getPassword())
.setDatabase(redisProperties.getDatabase());
//添加主从配置
//config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""});
//集群
//config.useClusterServers().addNodeAddress(new String[]{"",""}).setPassword("");
try {
redissonClient = Redisson.create(config);
return redissonClient;
} catch (Exception e) {
log.error("RedissonClient init redis url :[{}]",url,e.getMessage());
return null;
}
}
}
redisson支持个各种redis环境,单机、主从、集群、哨兵等
4) 编写工具类实现锁的添加与释放及查询redisson配置信息
@Slf4j
@Component
public class ResissonUtil {
@Autowired
private RedissonClient redissonClient;
/**
* 获取RedissonClient 配置信息
*/
public void getRedissonConfig() throws IOException {
Config config = redissonClient.getConfig();
System.out.println(config.toJSON());
}
}
@Slf4j
@Component
public class RedissionLockUtil {
@Autowired
private RedissonClient redissonClient;
/**
* 加锁
* @param lockname 名称
*/
public Boolean lock(String lockname){
try {
if(null == redissonClient){
log.error("RedissonClient is null");
return false;
}
RLock lock = redissonClient.getLock(lockname);
lock.lock(30, TimeUnit.SECONDS); //30秒后释放锁,防止死锁
log.info("Thread [{}] lock [{}] success",Thread.currentThread().getName(),lockname);
return true;
} catch (Exception e) {
log.info("lock [{}] exception",lockname,e);
return false;
}
}
/**
* 释放锁
* @param lockname 名称
*/
public Boolean unlock(String lockname){
try {
if(null == redissonClient){
log.error("RedissonClient is null");
return false;
}
RLock lock = redissonClient.getLock(lockname);
lock.unlock();
log.info("Thread [{}] unlock [{}] success",Thread.currentThread().getName(),lockname);
return true;
} catch (Exception e) {
log.info("unlock [{}] exception",lockname,e);
return false;
}
}
}
5)编写测试代码
@RestController
@RequestMapping("/lock")
public class RedissionLockTest {
@Autowired
private RedissionLockUtil lockUtil;
@Autowired
private ResissonUtil resissonUtil;
@GetMapping("/test")
public void testLock() throws IOException {
resissonUtil.getRedissonConfig();
for (int i = 0;i < 5;i++) {
new Thread(new Runnable() {
@Override
public void run() {
Boolean lockStatus = lockUtil.lock("LOCK");
}
}).start();
}
}
}
6)启动项目,访问 http://localhost:8080/lock/test
控制台输出配置信息及日志信息,通过红框可以看出,因为我们没有释放锁,所以每个线程都会等待30s后当前线程释放锁以后才能执行。