springboot +redission 实现分布式锁的小demo

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),从而让使用者能够将精力更集中地放在处理业务逻辑上。
官网地址:https://redisson.org/

GitHub地址:https://github.com/redisson/redisson

1.最佳实践

1.1 导入依赖


    org.redisson
    redisson
    3.10.6

1.2 配置redis的配置

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.RedisClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

/**
 * @author 董志伟
 * @version 1.0
 * @date 2019/7/25 10:33
 */
@Configuration
public class RedisConfig {


    @Bean
    public RedissonClient getRedisClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456");
        return Redisson.create(config);
    }
}

1.3 常见API

RedissClient中定义了常用的锁
springboot +redission 实现分布式锁的小demo_第1张图片

// 创建锁对象,并制定锁的名称
RLock lock = redissonClient.getLock("taskLock");

获取锁对象后,可以通过tryLock()方法获取锁:

springboot +redission 实现分布式锁的小demo_第2张图片
有3个重载的方法:

  • 三个参数:获取锁,设置锁等待时间waitTime、释放时间leaseTime,时间单位unit

    • 如果获取锁失败后,会在waitTime减去获取锁用时的剩余时间段内继续尝试获取锁,如果依然获取失败,则认为获取锁失败;
    • 获取锁后,如果超过leaseTime未释放,为避免死锁会自动释放。
  • 两个参数:获取锁,设置锁等待时间time、时间单位unit。释放时间leaseTime按照默认的30s

  • 空参:获取锁,waitTime默认0s,即获取锁失败不重试,leaseTime默认30s

任务执行完毕,使用unlock()方法释放锁:

//释放锁
tasklock.unlock();

1.4 完整测试代码

 @Test
    public void redissTest() throws InterruptedException {

        // 创建锁对象,并制定锁的名称
        RLock tasklock = redissonClient.getLock("taskLock");
        // 获取锁,设置自动失效时间为50s
        boolean isLock = tasklock.tryLock(50,TimeUnit.SECONDS);
        // 判断是否获取锁
        if (!isLock) {
            // 获取失败
            log.info("获取锁失败,停止定时任务");
            return;
        }
        try {
            // 执行业务
            log.info("获取锁成功,执行定时任务。");
            // 模拟任务耗时
            Thread.sleep(500);
        } catch (InterruptedException e) {
            log.error("任务执行异常", e);
        } finally {
            // 释放锁
            tasklock.unlock();
            log.info("任务执行完毕,释放锁");
        }


    }

你可能感兴趣的:(springboot +redission 实现分布式锁的小demo)