redission配置类 RedissionConfig
@Configuration
public class RedissonConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private String redisPort;
@Bean
public RedissonClient redisson() throws IOException {
// 1.创建配置
Config config = new Config();
// 集群模式
// config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
// 2.根据 Config 创建出 RedissonClient 示例。
config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort);
return Redisson.create(config);
}
}
redission工具类 RedissionUtil
@Component
public class RedissionUtil {
@Autowired
private RedissonClient redissonClient;
/**
* 锁住不设置超时时间(拿不到lock就不罢休,不然线程就一直block)
*
* @param lockKey
* @return org.redisson.api.RLock
*/
public RLock lock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
return lock;
}
/**
* leaseTime为加锁时间,单位为秒
*
* @param lockKey
* @param leaseTime
* @return org.redisson.api.RLock
*/
public RLock lock(String lockKey, long leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(leaseTime, TimeUnit.SECONDS);
return null;
}
/**
* timeout为加锁时间,时间单位由unit确定
*
* @param lockKey
* @param unit
* @param timeout
* @return org.redisson.api.RLock
*/
public RLock lock(String lockKey, TimeUnit unit, long timeout) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(timeout, unit);
return lock;
}
/**
* 尝试获取锁
*
* @param lockKey
* @param unit
* @param waitTime 最长等待时间
* @param leaseTime 获取锁之后 leaseTime之后将会自动释放锁
* @return boolean
*/
public boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
return false;
}
}
/**
* 通过lockKey解锁
*
* @param lockKey
* @return void
*/
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.unlock();
}
/**
* 直接通过锁解锁
*
* @param lock
* @return void
*/
public void unlock(RLock lock) {
lock.unlock();
}
}
逻辑过程具体实现
String REDISSON_KEY = ConstantStringUtil.productLockKey + product.getId();
//尝试获取锁,等待10秒,自己获得锁之后一直不解锁则15秒自动解锁
boolean lock = redissionUtil.tryLock(REDISSON_KEY, TimeUnit.SECONDS, 10, 15);
try {
if (lock) {
//获取锁
//todo 具体逻辑操作实现
} else {
//锁已被抢占,没抢到
log.info("当前排队人数较多,请稍后重试");
}
} catch (Exception e) {
//log.error("线程:{" + Thread.currentThread().getName() + "} 获取锁失败");
throw e;
} finally {
//解锁
redissionUtil.unlock(REDISSON_KEY);
}