当前位置: 首页 > news >正文

mybatisplus雪花算法id重复日记

雪花算法组成:

由于mysql数据库长整型最大64位,最大值为2的63次方-1。所以雪花算法最大也只能是64位。

第一位符号位0表示正数

后41位表示时间戳,最大值也就是2的41次方毫秒,除去一年1000*60*60*24*365毫秒,约等于69年。

再5位的数据中心id,5位的机器id,最大值31,加上为0的情况,有32*32种可能。

最后12位序列号,最大值4095,加上0,4096种可能。也就是一毫秒能产生4096个雪花序列。

其他变种

百度的UidGenerator雪花算法,缩短时间戳位数,也就是减少了使用时间。大约8.7年用完,就是超出28位了。

MyBatisPlus自带的雪花算法实现DefaultIdentifierGenerator

核心的数据中心id:根据当前服务机器的MAC地址,转16进制低位对32取模。

机器id:数据中心id+jvm进程id,转16进制低位对32取模。

id重复问题:由于微服务环境是容器,获取到宿主机mac地址是一样的,导致数据中心id重复,并且jvm的 pid,取模后也可能重复,造成不同机器,雪花算法的数据中心id和机器id是相同的,产生的id也就可能相同。

解决办法:手动指定数据中心id和机器id

手动指定方案:

1、数据中心id:每个服务appid固定分配不同的[0-31]值。

2、机器id:考虑容器环境下,服务会重启、扩容、宕机等场景,机器id需要每次分配都是新的,不重复的需求。

我们每个应用服务的集群,大约有8~9台机器。

基于以上前提,制定使用数据库保证分布式唯一机器id,每台机器启动时主动到数据库插入一行记录,获取到自增的id,对32取模,得出机器id。

这样每台机器都能有序的获取到机器id。

实现springRunner,在容器启动后,注入SqlSessionFactory执行以上逻辑即可。手动指定完雪花算法实现类参数会新生成实现类,需要替换SqlSessionFactory里面的MybatisConfiguration的GlobalCofig里的IdentifierGenerator实现类。

机器id重复场景思考:只要一个应用的集群机器数量不超过16台,并且不存在超过16台机器重启,其余不重启的情况,就不会有重复机器id的问题。

比如有20台机器,开始分配0-19机器id,突然5-19的机器都重启了,那势必会有机器与0-4的重复。

这个情况基本忽略。

相关文章:

  • PicFlow:一个图片处理与上传工作流工具(图床上传工具)
  • Debian12生产环境配置笔记
  • systemctl restart 和 systemctl reload 和 systemctl daemon-reload 对比 笔记250322
  • SOFABoot-10-聊一聊 sofatboot 的十个问题
  • QEMU 引导时分离内核和文件系统
  • Collectors.toList / list 转 list
  • Netty——BIO、NIO 与 Netty
  • 第十六章:Specialization and Overloading_《C++ Templates》notes
  • ‌App Store美学竞争:如何通过广告素材分析实现ASO弯道超车‌
  • 基于Spring Boot 的在线教育系统(源码+lw+部署文档+讲解),源码可白嫖!
  • PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具
  • SEO长尾关键词精准布局
  • 为什么后端路由需要携带 /api 作为前缀?前端如何设置基础路径 /api?
  • 批量图片压缩工具,高效减小文件大小并保持质量
  • deepSeek-SSE流式推送数据
  • OAuth 2.0认证
  • UE4学习笔记 FPS游戏制作12 添加第二把枪,制作枪的父类,动态生成物体,切换武器
  • 使用外部事件检测接入 CDH 大数据管理平台告警
  • 能不能解释一下 ,什么是React 的错误边界?
  • K8S学习之基础四十三:k8s中部署elasticsearch
  • 印度扩大对巴措施:封锁巴基斯坦名人账号、热门影像平台
  • 刘翔的赛会纪录被改写,田径钻石赛在赛场内外交出精彩答卷
  • 大一女生头孢过敏输液室呼救无医护响应,自行拔针仍不幸身亡
  • 俄罗斯期望乌克兰在停火期间采取行动缓和局势
  • 英国传统两党受挫地方选举后反思,改革党异军突起“突破想象”
  • 5月2日,全社会跨区域人员流动量完成29275.4万人次