分布式锁解决集群下的方法抢占执行

问题描述:

  启动两台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释放锁以后,其它客户才能操作

posted @ 2023-07-05 10:53  佛系粥米  阅读(44)  评论(0编辑  收藏  举报