Redis分布式锁Redisson使用简单介绍
Redis分布式锁Redisson使用简单介绍
一、配置引用
1.pom文件中引用jar包
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.5</version> </dependency>
2.代码配置文件
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; /** * @Author Gooqeal * @Date: 2021/12/23 9:46 * @Version 1.0 */ @Configuration public class RedissonConfig { @Value("${redis.master.name}") private String masterName; @Value("${redis.sentinel.ip1}") private String sentinelIp1; @Value("${redis.sentinel.ip2}") private String sentinelIp2; @Value("${redis.sentinel.ip3}") private String sentinelIp3; @Value("${redis.sentinel.port1}") private String port1; @Value("${redis.sentinel.port2}") private String port2; @Value("${redis.sentinel.port3}") private String port3; @Value("${redis.database}") private int dataBase; @Value("${redis.password}") private String password; @Bean public RedissonClient redissonClient(){ Config config = new Config(); config.useSentinelServers().setMasterName(masterName) .addSentinelAddress("redis://"+sentinelIp1+":"+port1) .addSentinelAddress("redis://"+sentinelIp2+":"+port2) .addSentinelAddress("redis://"+sentinelIp3+":"+port3).setPassword(password) .setDatabase(dataBase).setTimeout(3600); System.out.println("sentinelIp1 = " + sentinelIp1); return Redisson.create(config); } }
说明:1.如果redis是受保护的SSL协议,redis://需替换成rediss://
2.支持多种redis连接模式,Cluster集群、单例、哨兵。示例使用哨兵模式redis,Cluster模式集群配置:
Config config = new Config(); config.useClusterServers().addNodeAddress("127.0.0.1:7000") .addNodeAddress("127.0.0.1:7001") .setPassword("password").setScanInterval(2000);
二、使用
1.直接注入
@Autowired private RedissonClient redissonClient;
2.简单使用
一般适用单体应用,可重入锁
//锁住业务key RLock lock = redissonClient.getLock("test"); //获取锁 lock.lock(); try { //执行业务逻辑 System.out.println("业务逻辑执行开始" ); for (int i = 0; i < 100; i++) { System.out.println("i = " + i); } System.out.println("业务逻辑执行结束" ); } catch (Exception e) { e.printStackTrace(); }finally { //释放锁 if (lock.isLocked()){ lock.unlock(); System.out.println("锁释放" ); } }
- 稍复杂使用
多线程并发一般使用公平锁
//公平锁 RLock lock = redissonClient.getFairLock("test"); //获取锁 不需要unlock方法手动解锁,10秒钟自动解锁 lock.lock(10, TimeUnit.SECONDS);
//公平锁 RLock lock = redissonClient.getFairLock("test"); //尝试获取锁,30秒之后自动解锁,30秒一般根据业务处理耗时设置 boolean res = lock.tryLock(30, TimeUnit.SECONDS); if (res){ //业务逻辑处理 } //tryLock需要手动解锁 lock.unlock();
4.分布式锁种类
可重入锁(Reentrant Lock)
公平锁(Fair Lock)
联锁(MultiLock)
红锁(RedLock)
读写锁(ReadWriteLock)
信号量(Semaphore)
可过期性信号量(PermitExpirableSemaphore)
闭锁(CountDownLatch)