分布式锁对比
方式 | 优点 | 缺点 |
---|---|---|
数据库 | 实现简单、易理解 | 数据库压力大 |
Redis | 易理解 | 不支持阻塞、自己实现 |
Zoopeeper | 支持阻塞 | 相对复杂 |
Curator | 提供方法 | 依赖Zookeeper、强一致 |
Redisson | 提供方法、可阻塞 |
如何选择
- 推荐使用Redisson和Curator实现的分布式锁
- 不推荐自己编写的分布式锁
// TODO 示例代码
对锁的操作,尽量提前到应用层,而非数据库层
/**
*
* 1、Redisson是基于Redis,使用Redisson之前,项目必须使用Redis
* 2、注意getLock方法中的参数,以specId作为参数,每个specId一个key,和
* 数据库中的行锁是一致的,不会是方法级别的锁
*/
RLock rLock = redisson.getLock("SPECID_"+specId);
try {
/**
* 1、获取分布式锁,锁的超时时间是5秒get
* 2、获取到了锁,进行后续的业务操作
*/
rLock.lock(5, TimeUnit.SECONDS);
int result = itemsMapperCustom.decreaseItemSpecStock(specId, buyCounts);
if (result != 1) {
throw new RuntimeException("创建失败,原因:库存不足!");
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e);
}finally {
/**
* 不管业务是否操作正确,随后都要释放掉分布式锁
* 如果不释放,过了超时时间也会自动释放
*/
rLock.unlock();
}