0
点赞
收藏
分享

微信扫一扫

SpringBoot集成yitter-idgenerator分布式Id

小禹说财 2023-07-04 阅读 56
wpf

 redissonutil ,redis自行继承

@Slf4j
@Component
@Order(0)
public class SystemInitConfig implements CommandLineRunner {

    @Autowired
    private RedissonUtil redissonUtil;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 分布式锁Key
     */
    private static final String CACHE_ID_GENERATOR = "LOCK_ID_GENERATOR";

    /**
     * 最大机器号Key
     */
    private static final String CACHE_WORKERID_MAXID= "CACHE_WORKERID_MAXID";

    /**
     * 已分配的机器号Key
     */
    private static final String CACHE_ID_IP = "CACHE_ID_IP";

    @Override
    public void run(String... args) throws Exception {
        //获取mac地址
        String macAddress = NetUtil.getLocalhost().getHostAddress();
        log.info("{} 配置分布式Id Work缓存========开始",macAddress);
        boolean existWorkerId =  redisTemplate.opsForHash().hasKey(CACHE_ID_IP, macAddress);
        //若已缓存在缓存中,直接跳过不设置
        if (existWorkerId) {
            log.info("{} 已配置分布式Id Work...",macAddress);
            return ;
        }
        try {
            //分布式锁等待120秒,执行时长最大120秒
            boolean  locked = redissonUtil.tryLock(CACHE_ID_GENERATOR, 120, 120);
            if (!locked) {
                throw new RuntimeException(macAddress+"设置分布式Id机器号失败");
            }
            ValueOperations <String,Integer> stringOperation = redisTemplate.opsForValue();
            boolean initWorkerId = stringOperation.setIfAbsent(CACHE_WORKERID_MAXID, 1);
            if( !initWorkerId ) {
                //若已存在key,对最大的机器号自增1
                stringOperation.increment(CACHE_WORKERID_MAXID);
            }
            Integer workerId =   stringOperation.get(CACHE_WORKERID_MAXID);
            IdGeneratorOptions options = new IdGeneratorOptions( workerId.shortValue());
            YitIdHelper.setIdGenerator(options);
            //设置mac地址 - workerid 到hash结构
            redisTemplate.opsForHash().put(CACHE_ID_IP,macAddress,workerId);
            log.info("已配置分布式Id Work,{} - {}",macAddress,workerId);
        } finally {
            redissonUtil.unlock(CACHE_ID_GENERATOR);
            log.info("{} 配置分布式Id Work缓存========结束",macAddress);
        }

    }
}

使用 

举报

相关推荐

0 条评论