分布式锁解决集群下的方法抢占执行
问题描述:
启动两台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释放锁以后,其它客户才能操作