专栏名称: macrozheng
专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。
今天看啥  ›  专栏  ›  macrozheng

MyBatis-Plus内置的主键生成策略有大坑,要注意!

macrozheng  · 公众号  ·  · 2024-12-23 10:32
    

主要观点总结

本文介绍了对Seata改进版雪花算法的理解和分析,包括其工作原理、优势以及可能存在的问题。文章还讨论了该算法在数据库中的表现,特别是在避免数据库页分裂方面的效果。

关键观点总结

关键观点1: Seata改进版雪花算法的工作原理和特点

该算法通过调整节点ID和时间戳的位置,解除了与操作系统时间戳的强绑定关系。每个节点生成的是单调递增的ID序列,全局来看并不保证单调递增。

关键观点2: Seata改进版雪花算法的优势

该算法能够在节点内部保持单调递增,减少数据库的页分裂,提高数据库性能。同时,通过巧妙的节点ID设计,能够支持大量的节点。

关键观点3: Seata改进版雪花算法的潜在问题

虽然该算法能够在节点内部保持单调递增,但在全局范围内并不保证单调递增。在极端情况下,频繁的数据删除操作可能会阻碍数据的收敛,影响算法的稳定状态。

关键观点4: 推荐的学习资源

推荐学习Github上标星11K的微服务实战项目mall-swarm,全套视频教程涵盖了Spring Cloud核心组件、微服务项目实战、Kubernetes容器化部署等内容。


文章预览

Boot+Cloud项目学习: macrozheng.com 昨天小伙伴使用Mybaits-Plus开发的项目线上( 集群、K8S )出现了主键重复问题,其报错如下: Mybatis-Plus启动时会通过 com.baomidou.mybatisplus.core.toolkit.Sequence 类的 getMaxWorkerId() 和 getDatacenterId() 方法来初始化workerId和dataCenterId()。 protected   long   getMaxWorkerId ( long  datacenterId,  long  maxWorkerId)   {     StringBuilder mpid =  new  StringBuilder();     mpid.append(datacenterId);     String name = ManagementFactory.getRuntimeMXBean().getName();      if  (StringUtils.isNotBlank(name)) {         mpid.append(name.split( "@" )[ 0 ]);     }      return  ( long )(mpid.toString().hashCode()  &   '\uffff' ) % (maxWorkerId +  1L ); } protected   long   getDatacenterId ( long  maxDatacenterId)   {     ...省略部分代码...      byte [] mac = network.getHardwareAddress();      if  ( null  != mac) {       ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览