本文共 2508 字,大约阅读时间需要 8 分钟。
Redisson 实现分布式锁(3)——项目落地实现
本项目基于以下技术栈实现:
本项目支持两种加锁模式:
自定义注解加锁
通过注解方式轻松实现分布式锁:@DistributedLock(value = "goods", leaseTime = 5) public String lockDecreaseStock() { // 业务逻辑 }常规加锁
直接调用 RedissonLock API:// 1、加锁 redissonLock.lock("redisson", 10); // 2、业务逻辑 // 3、解锁 redissonLock.unlock("redisson");支持四种 Redis 部署模式:
仅需修改 application.properties 配置文件即可切换部署方式,无需代码修改。
项目模块划分清晰:
redis-distributed-lock-core:核心实现模块,包含以下功能: redis-distributed-lock-web-test:测试模块 通过模拟 1 秒内 100 个线程请求接口,测试分布式锁的性能和正确性。
public static volatile Integer TOTAL = 10;@GetMapping("lock-decrease-stock") public String lockDecreaseStock() throws InterruptedException { redissonLock.lock("lock", 10); if (TOTAL > 0) { TOTAL--; } Thread.sleep(50); // 检查当前线程是否持有锁 if (redissonLock.isHeldByCurrentThread("lock")) { redissonLock.unlock("lock"); } return "库存减少成功";} 测试结果显示,lock 锁在高并发场景下表现稳定,避免了超卖问题。
public static volatile Integer TOTAL = 10;@GetMapping("trylock-decrease-stock") public String trylockDecreaseStock() throws InterruptedException { if (redissonLock.tryLock("trylock", 10, 5)) { if (TOTAL > 0) { TOTAL--; } Thread.sleep(50); redissonLock.unlock("trylock"); return "库存减少成功"; } else { log.warn("[ExecutorRedisson] 获取锁失败"); return "未能获取锁"; }} trylock 锁在部分场景下可能导致库存减少操作跳过,但通过合理设置超时时间可以避免。
public static volatile Integer TOTAL = 10;@GetMapping("annotatin-lock-decrease-stock") @DistributedLock(value = "goods", leaseTime = 5) public String lockDecreaseStock() throws InterruptedException { if (TOTAL > 0) { TOTAL--; } return "库存减少成功";} 注解锁适用于方法级锁管理,粒度较大,适合分布式场景。
lock 锁是最优选择,因为其性能更优且更安全。
通过模拟 5 秒内 1000 个线程压测,得出以下结果:
trylock 锁在单次测试中表现优于 lock 锁,但从长期性能来看,lock 锁更稳定。
在使用 RedissonLock 时,可能会遇到以下异常:
redissonLock.lock("redisson", 1);// 业务逻辑需要 2 秒redissonLock.release("redisson"); 原因分析:线程 1 获得锁后,业务逻辑执行 1 秒后锁自动过期,线程 2 获得锁。线程 1 调用 release 时,由于锁不再由当前线程持有,会抛出异常。
解决方案:合理设置锁过期时间,避免过短导致异常。可以通过 isHeldByCurrentThread 方法判断当前线程是否持有锁。
本文通过实际项目实现和测试,总结了 Redisson 实现分布式锁的经验与教训,希望对开发者有所帮助。如果内容对您有价值,请给予支持!
转载地址:http://jvffz.baihongyu.com/