SpringBoot Redisson使用 分布式锁

avatar 2021年12月20日09:48:53 6 2182 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

最近在公司项目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;
}

 

 

 

 

 

 

  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0