1、Redisson介绍
Redisson 是 java 的 Redis 客户端之一,是 Redis 官网推荐的 java 语言实现分布式锁的项目。Redisson 提供了一些 api 方便操作 Redis。因为本文主要以锁为主,所以接下来我们主要关注锁相关的类,以下是 Redisson
中提供的多样化的锁:
可重入锁(Reentrant Lock) 公平锁(Fair Lock) 联锁(MultiLock)
红锁(RedLock) 读写锁(ReadWriteLock) 信号量(Semaphore) 等等
总之,管你了解不了解,反正 Redisson 就是提供了一堆锁… 也是目前大部分公司使用 Redis 分布式锁最常用的一种方式。
本文中 Redisson 分布式锁的实现是基于 RLock 接口,而 RLock 锁接口实现源码主要是 RedissonLock 这个类,而源码中加锁、释放锁等操作都是使用 Lua 脚本来完成的,并且封装的非常完善,开箱即用。
应用:
@Override
@Transactional(rollbackFor = Exception.class)
public boolean createOrder(String userId, String productId) {
// 如果不加锁,必然超卖
RLock lock = redissonClient.getLock("stock:" + productId);
try {
lock.lock(10, TimeUnit.SECONDS);
int stock = stockService.get(productId).getStockNum();
log.info("剩余库存:{}", stock);
if (stock <= 0) {
return false;
}
String orderNo = UUID.randomUUID().toString().replace("-", "").toUpperCase();
if (stockService.decrease(productId)) {
Order order = new Order();
order.setUserId(userId);
order.setProductId(productId);
order.setOrderNo(orderNo);
Date now = new Date();
order.setCreateTime(now);
order.setUpdateTime(now);
orderDao.save(order);
return true;
}
} catch (Exception ex) {
log.error("下单失败", ex);
} finally {
lock.unlock();
}
return false;
}
去除业务逻辑,加锁框架结构为:
RLock lock = redissonClient.getLock("xxx");
lock.lock();
try {
...
} finally {
lock.unlock();
}
关于 RedLock 中的方法
因为 RLock 本身继承自 Lock 接口,如下分为两部分展示:
public interface RLock extends Lock, RLockAsync {
//----------------------Lock接口方法-----------------------
void lock();
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
void lockInterruptibly();
//----------------------RLock接口方法-----------------------
void lock(long leaseTime, TimeUnit unit);
boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;
boolean isLocked();
boolean isHeldByCurrentThread();
void lockInterruptibly(long leaseTime, TimeUnit unit);
}



