123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- package org.jeecg.boot.starter.lock.client;
- import lombok.extern.slf4j.Slf4j;
- import org.redisson.api.RLock;
- import org.redisson.api.RedissonClient;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.stereotype.Component;
- import java.util.concurrent.TimeUnit;
- /**
- * 分布式锁实现基于Redisson
- *
- * @author zyf
- * @date 2020-11-11
- */
- @Slf4j
- @Component
- public class RedissonLockClient {
- @Autowired
- private RedissonClient redissonClient;
- @Autowired
- private RedisTemplate<String, Object> redisTemplate;
- /**
- * 获取锁
- */
- public RLock getLock(String lockKey) {
- return redissonClient.getLock(lockKey);
- }
- /**
- * 加锁操作
- *
- * @return boolean
- */
- public boolean tryLock(String lockName, long expireSeconds) {
- return tryLock(lockName, 0, expireSeconds);
- }
- /**
- * 加锁操作
- *
- * @return boolean
- */
- public boolean tryLock(String lockName, long waitTime, long expireSeconds) {
- RLock rLock = getLock(lockName);
- boolean getLock = false;
- try {
- getLock = rLock.tryLock(waitTime, expireSeconds, TimeUnit.SECONDS);
- if (getLock) {
- log.info("获取锁成功,lockName={}", lockName);
- } else {
- log.info("获取锁失败,lockName={}", lockName);
- }
- } catch (InterruptedException e) {
- log.error("获取式锁异常,lockName=" + lockName, e);
- getLock = false;
- }
- return getLock;
- }
- public boolean fairLock(String lockKey, TimeUnit unit, int leaseTime) {
- RLock fairLock = redissonClient.getFairLock(lockKey);
- try {
- boolean existKey = existKey(lockKey);
- // 已经存在了,就直接返回
- if (existKey) {
- return false;
- }
- return fairLock.tryLock(3, leaseTime, unit);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return false;
- }
- public boolean existKey(String key) {
- return redisTemplate.hasKey(key);
- }
- /**
- * 锁lockKey
- *
- * @param lockKey
- * @return
- */
- public RLock lock(String lockKey) {
- RLock lock = getLock(lockKey);
- lock.lock();
- return lock;
- }
- /**
- * 锁lockKey
- *
- * @param lockKey
- * @param leaseTime
- * @return
- */
- public RLock lock(String lockKey, long leaseTime) {
- RLock lock = getLock(lockKey);
- lock.lock(leaseTime, TimeUnit.SECONDS);
- return lock;
- }
- /**
- * 解锁
- *
- * @param lockName 锁名称
- */
- public void unlock(String lockName) {
- try {
- redissonClient.getLock(lockName).unlock();
- } catch (Exception e) {
- log.error("解锁异常,lockName=" + lockName, e);
- }
- }
- }
|