当前位置: 首页 > news >正文

SpringBoot 整合 Redisson——分布式锁最佳实践

自己用 Redis SETNX 实现的分布式锁有各种坑(锁续期、误删、非原子)。Redisson 是官方推荐的分布式锁方案,开箱即用。

一、引入依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.25.0</version></dependency>

二、配置

@ConfigurationpublicclassRedissonConfig{@BeanpublicRedissonClientredissonClient(){Configconfig=newConfig();config.useSingleServer().setAddress("redis://localhost:6379");returnRedisson.create(config);}}

三、基础用法

@ServicepublicclassSeckillService{@AutowiredprivateRedissonClientredissonClient;@AutowiredprivateStringRedisTemplateredisTemplate;publicResultVO<?>seckill(LongproductId,LonguserId){StringlockKey="lock:seckill:"+productId;RLocklock=redissonClient.getLock(lockKey);// 尝试获取锁,最多等3秒,锁自动续期booleanlocked=false;try{locked=lock.tryLock(3,30,TimeUnit.SECONDS);if(!locked){returnResultVO.error(429,"操作太频繁,请稍后重试");}// 业务逻辑returndoSeckill(productId,userId);}catch(InterruptedExceptione){returnResultVO.error(500,"系统异常");}finally{// 释放锁(只有持有锁的线程能释放)if(locked&&lock.isHeldByCurrentThread()){lock.unlock();}}}}

四、注解式锁

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceRedissonLock{/** 锁的key(支持SpEL) */Stringkey();/** 等待锁时间 */longwaitTime()default3;/** 锁过期时间 */longleaseTime()default30;}
@Aspect@ComponentpublicclassRedissonLockAspect{@AutowiredprivateRedissonClientredissonClient;@Around("@annotation(lock)")publicObjectaround(ProceedingJoinPointpjp,RedissonLocklock)throwsThrowable{Stringkey=parseKey(lock.key(),pjp);RLockrlock=redissonClient.getLock(key);booleanlocked=rlock.tryLock(lock.waitTime(),lock.leaseTime(),TimeUnit.SECONDS);if(!locked){thrownewBusinessException(429,"操作太频繁");}try{returnpjp.proceed();}finally{if(rlock.isHeldByCurrentThread()){rlock.unlock();}}}}

五、可重入锁

// Redisson 的锁是可重入的// 同一个线程可以多次获取同一个锁publicvoidmethodA(){RLocklock=redissonClient.getLock("lock:test");lock.lock();methodB();// 内部再次获取同一个锁,不会死锁lock.unlock();}publicvoidmethodB(){RLocklock=redissonClient.getLock("lock:test");lock.lock();// 业务逻辑lock.unlock();}

六、公平锁

// 公平锁:按请求顺序获取锁RLockfairLock=redissonClient.getFairLock("lock:fair");

七、读写锁

// 读锁:多个线程可同时读// 写锁:独占RReadWriteLockrwLock=redissonClient.getReadWriteLock("lock:rw");RLockreadLock=rwLock.readLock();// 读锁RLockwriteLock=rwLock.writeLock();// 写锁

八、Redisson vs 手写 SETNX

特性手写 SETNXRedisson
锁续期❌ 自己实现✅ 自动续期
释放校验❌ 可能误删✅ 校验线程
可重入
公平锁
读写锁
看门狗

九、看门狗机制

// Redisson 的锁默认使用看门狗(watchdog)// 如果业务执行时间超过锁的过期时间(默认30秒),看门狗会自动续期// 每 10 秒续期一次,直到业务完成释放锁// 注意:只有不指定 leaseTime 时看门狗才生效RLocklock=redissonClient.getLock("lock:test");lock.lock();// 不指定leaseTime → 看门狗生效

十、秒杀场景最佳实践

@ServicepublicclassSeckillService{@RedissonLock(key="seckill:#productId",waitTime=3,leaseTime=30)publicResultVO<?>doSeckill(@PathVariableLongproductId,LonguserId){// 前置校验SeckillProductproduct=productService.getById(productId);if(product==null||product.getStatus()!=1){returnResultVO.error(404,"商品不存在");}// 时间校验LocalDateTimenow=LocalDateTime.now();if(now.isBefore(product.getSeckillStart())){returnResultVO.error(400,"秒杀未开始");}// 库存扣减introws=productMapper.decrementStock(productId);if(rows==0){returnResultVO.error(400,"库存不足");}// 创建订单returnResultVO.success("秒杀成功");}}

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/MySQL 实战干货,不让你白来。

http://www.jsqmd.com/news/1338000/

相关文章:

  • 上海行业领先的平板热压机批发商如何筛选优质厂家? - 品牌优推
  • 标题:云服务器到期续费前,最该重新核算的九件事
  • 拉普拉斯变换:从频域视角透视电路稳定性与波特图设计
  • 05-训练与部署基础设施
  • DRF视图与路由深度解析:从APIView到ViewSet的RESTful API构建实践
  • 2026年北京评价高的发电设备租赁品牌怎么选 - 品牌优推
  • 今年大流量滤芯市场主流品牌有哪些
  • SQL查询优化:WHERE与HAVING的本质区别与实战应用
  • 同一篇论文,DeepSeek 和 Kimi 谁画的流程图更能看?(提示词附上)
  • Element UI/Plus el-select大数据性能优化:两种滚动加载实现方案详解
  • 成都酒店海鲜池怎么选?2026年四川水产店海鲜池定制哪家好? - 优质品牌商家
  • UE5集成本地大模型实战:Llama-Unreal插件配置与AI对话开发指南
  • 运放自激振荡的克星:米勒频率补偿原理与实战设计
  • MySQL安装全攻略:从版本选择到避坑排错,一站式解决安装难题
  • Node.js调用Threads API实战:登录、Token管理与限流解决方案
  • OpenClaw:一体化AI智能体平台部署与实战指南
  • 大数据清洗实战:Pandas与PySpark技术解析与应用
  • 电脑电源保护电路全解析:OCP、OVP、OPP等六大机制如何守护硬件安全
  • FastAPI与ollama大模型异步流式响应实战
  • 1.3 亿 USDT 冻结之后:OFAC 扩大对伊朗加密金融网络的打击
  • 深入解析浮点数加法:从IEEE 754标准到精度丢失的工程实践
  • 2026年在河北怎么挑优质的房屋渗漏堵漏修缮公司 - 品牌优推
  • 2026年找上海专业的危化品储存柜生产厂家看这里 - 品牌优推
  • 基于Antd的React中台框架:从技术选型到核心模块封装实战
  • 光伏电站无功响应特性与Matlab优化配置实践
  • Java堆栈信息获取全解析:从异常处理到性能监控实战
  • EHR系统选型与实施指南:从六大模块解构到落地避坑
  • Kruskal-Wallis H检验:非参数多组比较的原理、Python实现与实战指南
  • OpenClaw Token消耗优化实战:精炼提示词与智能缓存降本增效
  • 诺和森装饰工程可信度高吗,2026实力测评与价格透明** - 工业设备