//github地址:https://github.com/chenjie199234/Corelib/tree/master/id
var offset uint64 = uint64(time.Date(2020, 5, 21, 13, 14, 0, 0, time.UTC).Unix())var lasttime uint64
var serverid uint64
var rollback uint64//64bit data
//00000000000000000000000000000000         000                000000               0          0000000000000000000000
//----32 bit timestamp(second)------3bit time rollback-----6bit serverid----1bit maxid lock-------22bit id----------
//-----can support 136 years--------rollback 8 times/s---can support 60 servers----------can make 4,000,000+ ids in one second
var base uint64func init() {if serverid <= 0 || serverid >= 64 {panic("[ID.init]serviceid range wrong,only support [1-63]")}now := uint64(time.Now().Unix())templasttime := now - offsetif now <= offset || templasttime > (1<<32-1) {panic("[ID.init]server time wrong")}lasttime = templasttimebase = getlasttime() + getrollback() + getserverid()go func() {tker := time.NewTicker(200 * time.Millisecond)for {<-tker.Cnow = uint64(time.Now().Unix())templasttime = now - offsetif now <= offset || templasttime > (1<<32-1) {panic("[ID.init]server time wrong")}if templasttime < lasttime {rollback++fmt.Printf("[ID.init]server time rollback,old time:%d current time:%d rollback:%dn", lasttime, templasttime, rollback&7)}if lasttime != templasttime {lasttime = templasttimebase = getlasttime() + getrollback() + getserverid()}}}()
}
func getlasttime() uint64 {return lasttime << 32
}
func getrollback() uint64 {return (rollback & 7) << 29
}
func getserverid() uint64 {return serverid << 23
}func GetId() (uint64,error) {if (base & (1 << 22)) > 0 {return 0, fmt.Errorf("[ID.GetId]max id used up")}newid := atomic.AddUint64(&base, 1)if (newid & (1 << 22)) > 0 {return 0, fmt.Errorf("[ID.GetId]max id used up")}return newid, nil
}

雪花算法id长度_分布式全局ID生成器(雪花算法golang无锁版)相关推荐

  1. mybatis可以生成不重复的id吗_分布式全局不重复ID生成算法

    在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高效 缺点:大并发.分布式情况下性能比较低 有些同学可能 ...

  2. 分布式全局ID生成器设计

    项目是分布式的架构,需要设计一款分布式全局ID,参照了多种方案,博主最后基于snowflake的算法设计了一款自用ID生成器.具有以下优势: 保证分布式场景下生成的ID是全局唯一的 生成的全局ID整体 ...

  3. 分布式全局唯一id实现-2 springCloud-MyBatis-Plus集成百度分布式全局id(uid-generator)

    前言:MyBatis-Plus 集成百度的uid-generator ,实现业务实体在insert 实体时,可以自动获取全局id,完成数据保存: 1 uid-generator 全局id 生成的方式了 ...

  4. 分布式全局唯一id实现-2.1 springCloud-MyBatis-Plus集成百度分布式全局id(uid-generator)--优化版

    前言:在上一篇 springCloud-MyBatis-Plus集成百度分布式全局id, id的生成全部交予程序实现,虽然可以通过集群的方式来提高id 生成服务的高可用性,但是依然需要考虑极端情况,在 ...

  5. 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)

    作者:H__D 转载自: https://www.cnblogs.com/h--d/p/11342741.html 一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. ...

  6. java 唯一id生成算法_分布式全局唯一ID生成方案之snowflake算法

    已有的方案: 可大致分为: 完全依赖关系/非关系型数据库递增的方案 完全不依赖数据源作为生成因子的UUID 半依赖数据源作为生成因子的snowflake 为什么推荐snowflake? 这个问题,可以 ...

  7. 7 种分布式全局 ID 生成策略,你更爱哪种?

    上了微服务之后,很多原本很简单的问题现在都变复杂了,例如全局 ID 这事! 最近工作中刚好用到这块内容,于是调研了市面上几种常见的全局 ID 生成策略,稍微做了一下对比,供小伙伴们参考. 当数据库分库 ...

  8. 七种分布式全局 ID 生成策略,你更爱哪种?

    上了微服务之后,很多原本很简单的问题现在都变复杂了,例如全局 ID 这事! 最近工作中刚好用到这块内容,于是调研了市面上几种常见的全局 ID 生成策略,稍微做了一下对比,供小伙伴们参考. 当数据库分库 ...

  9. 分布式全局ID生成器

    需求背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息 ...

最新文章

  1. [导入]失败的软件实训课
  2. pypthon3精要(11)-try,except,else异常处理
  3. grunt的学习和使用
  4. 【Python】利用graphviz和pycallgraph库自动生成Python函数调用关系图
  5. 【Modern OpenGL】转换 Transformations
  6. mysql不可重复读是锁的表吗,Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)...
  7. shell截取字符串的8种方法
  8. Cocos2d-x内置的常用层
  9. Fiddler抓包工具版面认识(一)
  10. 在envi做随机森林_【模型篇】随机森林模型(Random Forest)
  11. 医院管理系统软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. openStack4j网络增删改查
  13. 根据Uniprot ID/PDB ID批处理获取蛋白质.pdb文件
  14. win10上运行linux程序吗,Win10可以运行 Linux 的图形界面程序了
  15. Apache shiro 官方API (中文版)(承蒙大佬们看重 小弟整理了下 无需积分 编辑的不好 希望帮到你们)
  16. BaiduOCR实现身份证,银行卡,机动车牌,图像审核等识别
  17. Shell编程——sed编辑器使用方法(详细图解各种使用方法例题)
  18. 基于matlab的OFDM通信链路仿真,输出OFDM频谱,星座图,收发时域波形
  19. k8s failed to watch file “/var/log/pods/xxx.log“: no space
  20. 写在2011的结尾,2012的开始

热门文章

  1. BootStrap Table和Mybatis Plus实现服务端分页
  2. 大型网站架构演进(4)使用应用服务器集群
  3. 简单poi创建execl
  4. 第一个简单APP设计图
  5. thoughtworks面试题分析与解答
  6. 安装Eclipse ADT插件时遇到的一些问题,错误
  7. 一步一步学Silverlight 2系列(5):实现简单的拖放功能_转载
  8. PostgreSQL 中如何delete重复数据
  9. Linux下grafana安装方式
  10. 提高Eclipse的运行速度 去掉JPA这个Eclipse 插件