分布式锁解决集群下的方法抢占执行
问题描述:
启动两台heima-leadnews-schedule服务,每台服务都会去执行refresh定时任务方法
分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。
分布式锁的解决方案:
sexnx (SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
请求锁:通过setnx设置锁,能设置成功说明没有别人占用锁,倘若失败,则已经有用户占用锁了。
成功获得锁后,操作完成后释放锁【删除】以便其他用户能获得锁。
/** * 加锁 * * @param name * @param expire * @return */ public String tryLock(String name, long expire) { name = name + "_lock"; String token = UUID.randomUUID().toString(); RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory(); RedisConnection conn = factory.getConnection(); try { //参考redis命令: //set key value [EX seconds] [PX milliseconds] [NX|XX] Boolean result = conn.set( name.getBytes(), token.getBytes(), Expiration.from(expire, TimeUnit.MILLISECONDS), RedisStringCommands.SetOption.SET_IF_ABSENT //NX ); if (result != null && result) return token; } finally { RedisConnectionUtils.releaseConnection(conn, factory,false); } return null; }
1、在分布式系统环境下,一个方法在同一时间内只能被一个机器的一个线程执行
2、主要是通过redis的setnx特性完成分布式锁的性能
A获取到锁以后其它客户端不能操作,只能等待A释放锁以后,其它客户才能操作
分类:
黑马头条 / 自媒体端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构