Redisson分布式锁
早睡蛋
# Redisson介绍
官方文档地址:https://github.com/redisson/redisson/wiki
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
# Redisson依赖配置
Maven:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.7</version>
</dependency>
1
2
3
4
5
2
3
4
5
# 默认程序化配置
Redisson程序化的配置方法是通过构建Config
对象实例来实现的。
Config config = new Config();
config.setTransportMode(TransportMode.EPOLL);
config.useClusterServers()
//可以用"rediss://"来启用SSL连接
.addNodeAddress("redis://127.0.0.1:6379");
1
2
3
4
5
2
3
4
5
# 单Redis节点模式
程序配置:
// 默认连接地址 127.0.0.1:6379
RedissonClient redisson = Redisson.create();
//不是本地Redis,就是用以下方法
Config config = new Config();
config.useSingleServer().setAddress("myredisserver:6379");
RedissonClient redisson = Redisson.create(config);
1
2
3
4
5
6
2
3
4
5
6
# 第一个Redisson程序
编写配置类:
/**
* @Author 早睡蛋
* @Date 2022/10/10 18:34:57
* @Desc:
*/
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://x.x.x.x:6379")
.setPassword("xxx");
return Redisson.create(config);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编写业务代码:
@Autowired
private RedissonClient redissonClient;
public void deduct() {
//加锁
RLock lock = redissonClient.getLock("lock");
lock.lock();
try {
//1.查询库存信息
String stock = redisTemplate.opsForValue().get("stock");
//2.判断库存是否充足
if (stock != null && stock.length() != 0) {
Integer st = Integer.valueOf(stock);
if (st > 0) {
//3.扣减库存
redisTemplate.opsForValue().set("stock", String.valueOf(--st));
}
}
} finally {
//解锁
lock.unlock();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
关于加锁代码,其实我们可以在lock()方法里面设置一些参数,比如锁的过期时间,这样我们就不用手动地去释放锁了。
//加锁
RLock lock = redissonClient.getLock("lock");
lock.lock(10, TimeUnit.SECONDS);
1
2
3
2
3
# Redisson常用配置
@Bean
public RedissonClient redissonClient() {
//初始化一个配置对象
Config config = new Config();
//useSingleServer表明本次配置是Redis单点服务
config.useSingleServer()
.setAddress("redis://43.138.140.213:6379")//Redis地址
.setDatabase(0)//设置使用的Redis数据库
.setUsername("")//用户名
.setPassword("hzc001109")//密码
.setConnectionMinimumIdleSize(10)//设置最小空闲连接数
.setConnectionPoolSize(50)//连接池最大线程数
.setIdleConnectionTimeout(60000)//线程超时时间
.setConnectTimeout(10000)//客户端程序获取Redis链接的超时时间
.setTimeout(5000);//响应超时时间
return Redisson.create(config);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17