最近在公司项目svn web化中,需要频繁对 authz 和 htpasswd 进行io操作。
防止出现多个人同时修改,导致文件数据错误。决定给这2个文件加锁。首先考虑到的是使用redis的锁。
具体实现如下
一、依赖
pom.xml
<!-- redis启动器,移除默认连接池lettuce-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-21</artifactId>
<version>3.10.1</version>
</dependency>
二、配置文件
1、application.yml
spring
# Redis配置
redis:
database: 14 # Redis服务器数据库
host: 127.0.0.1 # Redis服务器地址
port: 6379 # Redis服务器连接端口# password# Redis服务器连接密码(默认为空)
timeout: 60000 # 连接超时时间(毫秒)
password:
jedis:
pool:
min-idle: 0 # 连接池中的最小空闲连接
max-idle: 10 # 连接池中的最大空闲连接
max-active: -1 # 连接池最大连接数(使用负值表示没有限制)
max-wait: 200 # 连接池最大阻塞等待时间(使用负值表示没有限制)
redisson:
address: redis://${spring.redis.host}:6379
2、RedisListenerConfig
import org.redisson.spring.data.connection.RedissonConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisListenerConfig {
@Autowired
private RedisTemplate redisTemplate;
/**
* 处理乱码
* @return
*/
@Bean
public RedisTemplate redisTemplateInit() {
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//val实例化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
RedisMessageListenerContainer container(RedissonConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
三、Redisson使用
这里通过2个方法来介绍
上面这个方法需要修改2个文件,需要2把锁;下面那个方法需要修改1个文件,需要1把锁
具体实现代码如下
@Override
public boolean deleteSvnUser(String svnUser) throws Exception
{
RLock[] locks = new RLock[2];
locks[0] = redissonClient.getLock(Constants.LOCK_PASSWD);
locks[1] = redissonClient.getLock(Constants.LOCK_AUTHZ);
RedissonMultiLock lock = new RedissonMultiLock(locks);
try {
lock.lock(5000, TimeUnit.MILLISECONDS);
// ...... 具体业务逻辑
}finally {
lock.unlock();
}
return true;
}
@Override
public boolean updatePassword(String svnUser, String svnPassword) throws Exception
{
RLock lock = redissonClient.getLock(Constants.LOCK_PASSWD );
try {
lock.lock(5000, TimeUnit.MILLISECONDS);
// ...... 具体业务逻辑
}finally {
lock.unlock();
}
return true;
}
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏