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

# 默认程序化配置

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

# 单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

# 第一个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

编写业务代码:

@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

关于加锁代码,其实我们可以在lock()方法里面设置一些参数,比如锁的过期时间,这样我们就不用手动地去释放锁了。

//加锁
        RLock lock = redissonClient.getLock("lock");
        lock.lock(10, TimeUnit.SECONDS);
1
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