8.1 为啥这样做

1.全局唯一性,不会出现重复的id。如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行分表 服务器B,C的数据库中创建user表 分别存储第2,3条数据B1 小红 女C1 张三 男此时存在问题,id重复
2.生成的id是随时间递增的,在执行sql操作时,会提高效率
3.每毫秒产生2^12-1个序列号,在高并发环境下表现良好

8.2 介绍雪花算法

雪花算法优点:

1.高并发分布式环境下生成不重复id
2.id随时间自增,在执行sql操作时,会提高效率

雪花算法缺点:

依赖于服务器时间,服务器时钟回拨时可能会生成重复id。
解决方法:通过记录最后一个生成id时的时间戳,每次生成id之前比较当前服务器时间是否回拨,避免生成重复id。
时钟回拨:硬件时钟可能会因为各种原因发生不准的情况,网络中提供了ntp服务来做时间校准,做校准时就会发生时钟的跳跃或者回拨。

64位整数组成的分布式ID

使用github.com/sony/sonyflake库的雪花算法

注意:下图中第三块和第四块标记反了,第三块为Machine ID(机器id) 第四块为Sequence ID(序列id)

1bit: 符号位,固定为0,没有实际作用
39bit: 表示 时间戳,单位是 10毫秒。用来代表创建ID的时刻与起始时刻的偏移量。起始时刻在雪花算法初始化时就指定
8bit: 机器id。分布式部署时,可能有多台服务器都可以生成ID,使用机器id来表示唯一的服务器
16bit: 序列id,用来记录 同一毫秒产生的不同id 每毫秒可用生成2^16-1个id

8.3 代码

pkg/snowflake/snowflake.go

package snowflakeimport ("fmt""time""web_app/setting""github.com/sony/sonyflake"
)var (sonyFlake     *sonyflake.Sonyflake // 实例sonyMachineID uint16               // 机器ID
)func getMachineID() (uint16, error) { // 返回全局定义的机器IDreturn sonyMachineID, nil
}// 需传入 指定日期 和 当前的机器ID
func Init(cfg *setting.SnowFlakeConfig) (err error) {sonyMachineID = cfg.MachineId//time.Parse(日期格式,具体日期) 参数类型 均为stringt, _ := time.Parse("2006-01-02", cfg.InitTime) // 初始化一个开始的时间/**type Settings struct {StartTime      time.TimeMachineID      func() (uint16, error)CheckMachineID func(uint16) bool}*/settings := sonyflake.Settings{ // 生成全局配置StartTime: t,//MachineID 字段 是函数类型MachineID: getMachineID, // 指定机器ID}sonyFlake = sonyflake.NewSonyflake(settings) // 用配置生成sonyflake节点return
}// GetID 返回生成的id值
//数据表中 bigint(20) 啥意思 就是该字段的值 最大是一个20位的数
//对应go中 类型为 uint64 也就是 该数用2进制表示 是64位2^64 的值 是一个无符号的20位的数
func GetID() (id uint64, err error) { // 拿到sonyflake节点生成id值if sonyFlake == nil {err = fmt.Errorf("snoy flake not inited")return}id, err = sonyFlake.NextID()return
}

config.yaml中雪花算法配置信息

#雪花算法
snowflake:init_time: "2022-7-28"machine_id: "1"

setting.go中雪花算法 配置信息结构体

//雪花算法配置
type SnowFlakeConfig struct {InitTime  string `mapstructure:"init_time"`MachineId uint16 `mapstructure:"machine_id"`
}

main.go中调用雪花算法

//7. 使用雪花算法 生成用户id
if err := snowflake.Init(setting.Conf.SnowFlakeConfig); err != nil {fmt.Printf("init snowflake failed, err :%v\n", err)return
}

基于雪花算法生成用户id相关推荐

  1. php绘制雪花墙,基于雪花算法的 PHP ID 生成器

    Snowflake 是 Twitter 内部的一个 ID 生算法,可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部分由 4 ...

  2. DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法

    DefaultIdentifierGenerator 雪花算法 生成 重复 id 前言 问题发生 排查原因 问题解决 前言 利用 mybatisplus 的 DefaultIdentifierGene ...

  3. python版雪花算法生成唯一ID

    一.雪花算法图解 理论一大堆,总结如下图: 下方为源码,返回的结果为19位,为10进制表示,使用二进制表示就是64位,所以不必有所疑惑. 二.源码 1.异常捕获块 文件名:exceptions.py ...

  4. 分布式下使用雪花算法生成全局ID及解决时钟回拨问题

    简介 雪花算法是 64 位 的二进制,一共包含了四部分: 1位是符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数 41位是时间戳,具体到毫秒,41位的二 ...

  5. 雪花算法生成分布式ID的时间回拨问题处理

    一般方法 1.直接抛异常 2.延迟等待到最新时间(需要回拨时间比较短) 3.采用历史最大时间 package com.zjq.javabasic.algorithm;/*** @description ...

  6. 根据时间戳生成编号_使用雪花算法生成流水号!

    前言"在分布式系统中常见的问题就是如何生成流水号,一般情况下会有专门的流水号系统,不过在开发过程中或者开发早期不一定会有专门流水号系统,在这里介绍下我所使用的流水号生成器--雪花算法&quo ...

  7. 注意:雪花算法并不是ID的唯一选择!

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 在<悟空传>篇外篇里,有一个忧伤的故事. 秋天,树上掉下两片叶子,你要和它们说再见.但你如何知道这片叶子,不是另外一片叶 ...

  8. mybatis-plus雪花算法生成Id使用详解

    文章目录 前言 一.mybatis-plus官网 二.雪花算法实战 1.建表 2.新建测试工程 3.单元测试 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 六.内置的雪花算法工具 ...

  9. 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID

    任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...

最新文章

  1. C++ STL,ATL,WTL之间的联系和区别
  2. (一) 关于配置travis-ci持续集成python pytest测试的相关记录
  3. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )
  4. windows 程序设计_Python 在windows环境简单搭建
  5. 面向过程之骑士飞行棋
  6. 【Linux】Linux用户、用户组、文件权限学习笔记
  7. TimesIsMoney
  8. 轻量级的jQuery表单校验插件: Happy.js
  9. 周末ROS学习沙龙第四期——动作编程、dynamic_reconfigure动态参数更新、控制机器人移动、传感器数据处理
  10. c# sha1签名 微信_微信公众号开发——微信JSSDK使用(踩坑)
  11. python全局变量的声明和使用_python自学篇(第三章:函数)
  12. html JS实现下拉菜单,vue.js怎么实现下拉框
  13. WM 仓库管理T-CODE
  14. 在机关事业单位工作年满五十岁,工龄三十年提前退休好还是继续工作好?
  15. 如何查看android设备是否支持Widevine DRM
  16. PSPNet论文详解
  17. html吃豆豆游戏代码,吃豆豆小游戏
  18. js 让鼠标右下角有一排小字_JavaScript+css代码实现漂亮的右下角弹窗提示
  19. 阿里巴巴国际站新店铺3个月的成果
  20. 存储过程——身份证校验

热门文章

  1. java 让坦克移动_java 坦克不能左右移动 可以上下
  2. 华为nova5i计算机在哪,IT教程:华为nova5与nova5i的区别
  3. 【电商】电商系统---合同管理
  4. PSD网页模板怎么用?
  5. 优秀前端人都知道的H5 移动端调试全攻略~
  6. <持续更新>机电工程_专业英语积累
  7. 金蝶K3 WISE 15版本用户手册
  8. R语言使用rnorm函数生成正太分布数据、使用plot函数可视化折线图、使用mtext函数在Y轴右侧添加文本标签
  9. 豆瓣阅读,真正的社会化阅读
  10. ORACLE数据库查询表名及表备注,字段名及字段备注SQL