集群环境下为雪花算法生成全局唯一机器ID策略

雪花算法是生成数据id非常好的一种方式,机器id是雪花算法不可分割的一部分。但是对于集群应用,让不同的机器自动产生不同的机器id传统做法就是针对每一个机器进行单独配置,但这样做不利于集群水平扩展,且操作过程非常复杂,所以每一个机器在集群环境下是一个头疼的问题。现在借助spring+redis,给出一种策略,支持随意水平扩展,肥肠好用。
大致策略分为4步:
1.对机器ip进行hash,对某一个(大于你的机器的个数)数取模,作为初始的机器ID。
2.将机器id存储到redis中(注册)。
3.以此类推,每一个机器初始化的时候都向redis注册一个数,若这个数注册过了,则+1重新注册。
4.在spring容器销毁时从redis中将注册信息删除。
下面给出具体实现代码:

@Service("machineIdUtil")
public class MachineIdUtil {
//日誌
    private static Logger logger = LogUtil.getLogger(MachineIdUtil.class);
  /**
  *redis 实例
  */
    @Autowired
    private Cluster jimClient;
    /**
     * 机器id
     */
    public static Integer machine_id;
    /**
     * 本地ip地址
     */
    private static String localIp;
    private static TimeUnit timeUnit = TimeUnit.DAYS;

    /**
     * hash机器IP初始化一个机器ID
     */
    @PostConstru
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
MyBatis-Plus的ID生成策略中,如果使用的是雪花算法(Snowflake),它是Twitter开源的一种分布式ID生成方案,主要为了解决高并发下生成不重复的ID问题。在集群部署的情况下,可能会遇到ID重复的问题,因为每个节点都有自己的时间戳和序列号生成ID。 解决ID重复的方法通常包括: 1. **配置全局唯一ID**: MyBatis-Plus提供了一个全局唯一ID生成器`SnowflakeIdWorker`,它会根据节点ID和毫秒数生成一个64位的ID。确保所有节点都配置相同的集群ID和序列号,这样可以保证ID的一致性。 ```java // 雪花算法配置示例 GlobalConfig global = new GlobalConfig(); global.setIdGenerator(new SnowflakeIdWorker(0, 0)); // 集群ID和序列号 ConfigUtil.initGlobal(global); ``` 2. **数据库层面的唯一索引**: 对于自增ID,可以在数据库表的主键字段上创建一个唯一索引,当插入操作发现该ID已经存在时,可以回滚事务或更新失败的记录。 3. **分布式锁**: 在高并发场景下,可能需要考虑使用分布式锁来确保同一时间只有一个节点生成新的ID,其他节点等待锁释放后才生成。 4. **分片策略**: 如果应用数据量非常大,可以考虑按照一定的规则对数据进行分片,每个分片使用独立的ID生成器,降低冲突概率。 相关问题: 1. 雪花算法是如何保证ID全局唯一的? 2. 在分布式环境中,如何配置MyBatis-Plus避免ID重复? 3. 分布式锁如何配合雪花算法在MyBatis-Plus中使用?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值