首先我们需要在application.properties文件中配置我们redis集群的节点,以及密码.
首先不要忘记在pom文件中引入相应的依赖
<!--# RedisTemplate-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--# redisson分布式锁-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.3</version>
</dependency>
1. 第一步
application.properties中配置代码如下:
#Redis
spring.redis.cluster.nodes=192.168.165.251:6379,192.168.165.251:6380,192.168.165.251:6381,192.168.165.251:6382,192.168.165.251:6383,192.168.165.251:6384
spring.redis.password=test
2.第二步
创建RedissonConfiguration类,这个类是Redisson的配置类,提供RedissonClient实例.
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* Redisson的配置类,提供RedissonClient实例
*
* @author it萌牛
*/
@Configuration
public class RedissonConfiguration {
@Value("#{'${spring.redis.cluster.nodes}'.split(',')}")
private List<String> nodes;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedissonClient getRedissonClient() {
Config config = new Config();
config.useClusterServers().setPassword(password);
//集群模式,集群节点的地址须使用“redis://”前缀,否则将会报错。
//此例集群为3节点,各节点1主1从
for (String node : nodes) {
String redisNode = "redis://" + node;
config.useClusterServers().addNodeAddress(redisNode);
}
return Redisson.create(config);
}
}
3.举个运用的栗子
@Override
public ResponseDto<Void> confirmReceive(ConfirmReceiveDto confirmReceiveDto) {
ResponseDto responseDto = new ResponseDto();
CommonClientResponse<String> resp = new CommonClientResponse<>();
String membershipId = confirmReceiveDto.getMembershipId();
/**
* 1、校验参数
*/
if (ObjectUtils.isEmpty(confirmReceiveDto.getAddressId())) {
throw MyException.build(ErrorConstant.NO_ADDRESS_EXCEPTION);
}
if (ObjectUtils.isEmpty(confirmReceiveDto.getType())) {
throw MyException.build(ErrorConstant.NO_TYPE_ERROR);
}
//分布式锁 从RedissonClient取得RLock实例 锁住会员id,防止用户多设备端薅羊毛
//尝试取锁,有效期为1min,到期后自动释放。如果取得锁继续执行。取锁失败则自旋。
RLock rLock = redissonClient.getLock(RECEIVE_GIFT + membershipId);
try {
boolean isLock = rLock.tryLock(2, 60, TimeUnit.SECONDS);
if (isLock) {
confirmReceiveGift(confirmReceiveDto, responseDto, resp, membershipId);
}
} catch (Exception e) {
responseDto.setCode("20000");
responseDto.setMessage(e.getMessage());
log.error("领取失败 ===> {}", e.getMessage());
} finally {
// 释放锁
rLock.unlock();
}
return responseDto;
}
好啦,这就是分布式锁的一个简单运用栗子,记录下来,希望能帮助到你.