对ruoyi-vue-plus中ID生成的理解By古_柯

对ruoyi-vue-plus中ID生成的理解

一直在攀登

对ruoyi-vue-plus中ID生成的理解如下

  1. ruoyi-vue-plus使用MyBatis-Plus作为ORM框架,其中主键ID生成使用的是MyBatis-Plus提供的雪花算法SnowflakeIdWorker。
  2. SnowflakeIdWorker会在应用启动时生成一个工作器(worker),其中包括数据中心ID、机器ID和序列号。
  3. 数据中心ID采用配置中心指定,默认是0。机器ID会读取运行环境的IP后两段作为机器标识。序列号是一个自增的长整形,起始值为0。
  4. ID生成时,会将当前毫秒时间、数据中心ID、机器ID和序列号拼接成一个64位的长整形值,作为主键ID。
  5. 其中41位是当前时间毫秒数,10位是工作器id(数据中心+机器id),12位是序列号。整体上实现了趋势递增,并且在分布式环境下可通过数据中心id和机器id来标识不同机器。
  6. 在ruoyi中,通过这种snowflake算法生成的ID可保证全局唯一性,并且对于排序、分库分表等都比较友好。

生成的ID为负值的原因可能有以下几点

  1. ID生成算法的问题
    一些ID生成算法在某些情况下会产生负值,比如经典的GUID算法中使用随机数生成时可能出现负值。
  2. 数据类型溢出
    如果ID使用的是整型,而生成的正数值超过了整型能表示的正数范围,就会出现负值。
  3. 数据库主键回退
    有些数据库在进行主键回收利用时,会将主键回退到一个负值然后重新进行递增分配。
  4. 时间回拨
    如果ID中包含时间戳信息,并且系统时间发生了回拨,也可能会导致生成负值的ID。
  5. 代码 Bug
    生成ID的代码存在问题,导致意外的负值。
  6. 用户自定义
    在一些特殊业务场景下,用户可能会自定义负值ID来使用。
    如果是Ruoyi中使用Snowflake算法出现负值,很大可能是时间回拨和数据类型溢出的问题。需要检查系统时间是否准确,以及数据库主键字段是否大小足够存放生成的

将字段类型从int4改为int8,对业务的影响主要有

  1. 数据迁移影响
    需要进行一次全表的数据迁移,将原有int4类型的数据转换为int8,这个过程中需要评估数据量大小,转换是否会对线上业务造成影响。
  2. 占用空间变化
    int8类型占用空间是int4的2倍,这会使得整个表的数据占用空间增大一倍,对数据库的压力有一定影响。
  3. 业务兼容性影响
    业务中使用该字段的地方,都需要评估是否可以兼容int8,尤其是一些与数值范围相关的业务判断需要重新设计。
  4. 性能影响
    由于int8占用空间变大,一些业务性能可能会有轻微影响。
  5. 存储计算影响
    如果有对该字段做统计计算的业务(求和、去重等),计算结果也可能会有变化。
  6. 数据接口影响
    与该字段相关的对外数据接口,接收和返回值类型需要调整为int8。
    总体来说,只要评估清楚上述影响并做好迁移、测试,这种简单的类型改动对业务影响有限。主要注意兼容性和性能评估。如果评估影响在可接受范围,可以进行这次改动。
    By@古柯
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值