1. maven
<!-- redisson 分布式锁 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.2</version> </dependency>
2. redisson客户端配置类
package harara.redis; import harara.StringUtil; 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 org.springframework.stereotype.Component; /** * @author: chenly * @date: 2019-11-05 19:58 * @description: redisson客户端配置类 * @version: 1.0 */ @Configuration @Component public class RedissonManager { /**redis集群节点*/ @Value(value = "${spring.redis.cluster.nodes:#{null}}") private String cluster; /**redis密码*/ @Value("${spring.redis.password:#{null}}") private String password; /**redis 单节点ip*/ @Value("${spring.redis.host:#{null}}") private String host; /**redis单节点端口*/ @Value("${spring.redis.port:#{null}}") private String port; /**最大连接数*/ @Value("${spring.redis.jedis.pool.max-active:30}") private int maxPoolSize; @Bean public RedissonClient getRedissonClient(){ return loadRedisson(); } public RedissonClient loadRedisson(){ RedissonClient client = null; Config config = new Config(); //单节点 if (!StringUtil.isEmpty(host)) { config.useSingleServer(). setAddress("redis://" + host + ":" + port) // .setPassword(password) .setConnectionPoolSize(maxPoolSize) //最小空闲连接 .setConnectionMinimumIdleSize(0); //如果密码不为空,设置密码 if(!StringUtil.isEmpty(password)){ config.useSingleServer().setPassword(password); } client = Redisson.create(config); } else { //集群节点 String[] nodes = cluster.split(","); //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加 for (int i = 0; i < nodes.length; i++) { nodes[i] = "redis://" + nodes[i]; } //这是用的集群server config.useClusterServers() //设置集群状态扫描时间2000 .setScanInterval(2000) .addNodeAddress(nodes) // .setPassword(password) .setMasterConnectionPoolSize(maxPoolSize) //最小空闲连接 .setMasterConnectionMinimumIdleSize(0); //如果密码不为空,设置集群密码 if (!StringUtil.isEmpty(password)) { config.useClusterServers().setPassword(password); } client = Redisson.create(config); // System.out.println(config.); //可通过打印redisson.getConfig().toJSON().toString()来检测是否配置成功 } return client; } }
3.获取锁类(加锁,解锁)
package harara.redis; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; /** * @author: chenly * @date: 2019-11-05 20:29 * @description: 获取redisson分布式锁类 * @version: 1.0 */ @Component @Slf4j public class RedissonDistributedLocker { @Autowired private RedissonClient redissonClient; /** * lock(),拿不到lock就不罢休,不然线程就一直block * @param lockKey * @return */ public RLock lock(String lockKey){ RLock lock = redissonClient.getLock(lockKey); lock.lock(); return lock; } /** * leaseTime为加锁时间,单位为秒 * @param lockKey 锁的名称 * @param leaseTime 加锁时间,单位秒 * @return */ public RLock lock(String lockKey,long leaseTime){ RLock lock = redissonClient.getLock(lockKey); lock.lock(leaseTime, TimeUnit.SECONDS); return lock; } /** * leaseTime为加锁时间,单位为秒 * @param lockKey 锁的名称 * @param unit 时间单位 * @param leaseTime 加锁时间 * @return */ public RLock lock(String lockKey,TimeUnit unit,long leaseTime){ RLock lock = redissonClient.getLock(lockKey); lock.lock(leaseTime,unit); return lock; } /** * 加锁 * tryLock(),马上返回,拿到lock就返回true,不然返回false。 * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false. * @param lockKey 锁的名称 * @param unit 单位名称 * @param waitTime 等待时间 * @param leaseTime 加锁时间 * @return */ public boolean tryLock(String lockKey,TimeUnit unit,long waitTime,long leaseTime){ RLock lock = redissonClient.getLock(lockKey); try{ lock.tryLock(waitTime,leaseTime,unit); return true; }catch (InterruptedException e){ return false; } } /** * * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false. * @param lockKey * @param waitTime * @return */ public boolean tryLock(String lockKey,long waitTime,TimeUnit unit){ RLock rLock = redissonClient.getLock(lockKey); try{ rLock.tryLock(waitTime,unit); return true; }catch (InterruptedException e){ return false; } } /** * 解锁 * @param lockKey 锁的名称 */ public void unlock(String lockKey){ RLock lock = redissonClient.getLock(lockKey); lock.unlock(); } /** * 解锁 * @param lock 锁 */ public void unlock(RLock lock){ lock.unlock(); } }