1. 程式人生 > 資料庫 >Redisson分散式鎖使用

Redisson分散式鎖使用

pom.xml

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.13.6</version>
</dependency>

application.yml 單機環境

spring:
  redis:
    host: ip
    port: 6379
    password: ******
    database: 1
    jedis:
      pool:
        min-idle: 3
        max-active: 8
        max-wait: 10000s
        timeout: 20000s

 Java程式碼

@Autowired
private RedissonClient redissonClient;
......
@Override
public void lockAdd(int time) {
    //對資料進行加鎖
    RLock lock = redissonClient.getLock("product001");
    log.info("lock...lock");
    //加鎖
    lock.lock();
    log.info("拿到鎖...O(∩_∩)O哈哈~");
    try {
        log.info("lock...start");
        TimeUnit.SECONDS.sleep(time);
        log.info("lock...end");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        log.info("lock...unlock");
        //解鎖
        lock.unlock();
    }
}

@Override
public void tryLockAdd(int time) {
    //對資料進行加鎖
    RLock lock = redissonClient.getLock("product001");
    log.info("lock...lock");
    try {
        //5s內一直嘗試獲取鎖,5s內未獲取到鎖就返回false取消執行;拿到鎖的執行緒最多持有鎖3分鐘,即使執行緒未執行完,3分鐘後也自動釋放鎖
        if (lock.tryLock(2, 10, TimeUnit.SECONDS)) {
            log.info("拿到鎖...O(∩_∩)O哈哈~");
            try {
                log.info("lock...start");
                TimeUnit.SECONDS.sleep(time);
                log.info("lock...end");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                log.info("lock...unlock: {}", lock.isLocked());
                //tryLock(long waitTime, long leaseTime, TimeUnit unit)方法需要判斷是否持有鎖再釋放,避免執行緒超時釋放鎖之後,拋異常
                if (lock.isLocked()) {
                    //解鎖
                    lock.unlock();
                }
            }
        } else {
            log.info("沒拿到鎖...o(╥﹏╥)o");
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

方法說明:

void lock():搶鎖,沒拿到鎖執行緒一致搶鎖,等其他執行緒釋放鎖之後,可搶到鎖。
boolean tryLock():嘗試搶鎖,拿到鎖返回true,未拿到返回false。
boolean tryLock(long time, TimeUnit unit):time時間內嘗試搶鎖,拿到鎖返回true,未拿到返回false,然後根據結果做處理。
boolean tryLock(long waitTime, long leaseTime, TimeUnit unit):
    waitTime時間內嘗試搶鎖,拿到鎖返回true,未拿到返回false,然後根據結果做處理;拿到鎖的執行緒leaseTime時間內持有鎖,超過leaseTime時間則自動釋放,不管執行緒是否執行完,所以需要設定,所以需要在unlock解鎖時候加個判斷,防止拋異常。