SpringBoot集成yitter-idgenerator分布式Id

该文章描述了一个Java类,用于初始化和配置基于Yitter-idgenerator的分布式ID生成系统。类中利用RedissonUtil和RedisTemplate实现分布式锁,确保在多节点环境中安全地设置和更新最大机器号。当MAC地址对应的workerId不存在时,会尝试设置并自增最大机器号,然后使用IdGeneratorOptions设置ID生成器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 <dependency>
    <groupId>com.github.yitter</groupId>
    <artifactId>yitter-idgenerator</artifactId>
    <version>1.0.6</version>
</dependency>

 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);
        }

    }
}

使用 

YitIdHelper.nextId() 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值