Redisson分散式鎖使用
阿新 • • 發佈:2021-01-13
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解鎖時候加個判斷,防止拋異常。