首页 > 其他分享 >111

111

时间:2024-11-21 12:47:56浏览次数:1  
标签:sequence timestamp lastTimestamp private datacenterId 111 long

  1 package com.xiaozhou.springbootwiki.util;
  2 
  3 //@Component
  4 public class SnowflakeIdWorker {
  5     // 起始的时间戳(自定义,例如系统上线时间)
  6     private final long twepoch = 1732162441000L;
  7 
  8     // 机器id所占的位数
  9     private final long workerIdBits = 5L;
 10 
 11     // 数据标识id所占的位数
 12     private final long datacenterIdBits = 5L;
 13 
 14     // 最大机器ID
 15     private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
 16 
 17     // 最大数据标识ID
 18     private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
 19 
 20     // 序列在id中占的位数
 21     private final long sequenceBits = 12L;
 22 
 23     // 机器ID左移12位
 24     private final long workerIdShift = sequenceBits;
 25 
 26     // 数据标识id左移17位(12+5)
 27     private final long datacenterIdShift = sequenceBits + workerIdBits;
 28 
 29     // 时间截左移22位(5+5+12)
 30     private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
 31 
 32     // 序列的掩码,这里为4095 (0b111111111111=4095)
 33     private final long sequenceMask = -1L ^ (-1L << sequenceBits);
 34 
 35     // 上次生成ID的时间截
 36     private long lastTimestamp = -1L;
 37 
 38     // 序列号
 39     private long sequence = 0L;
 40 
 41     // 工作机器ID
 42     private final long workerId;
 43 
 44     // 数据中心ID
 45     private final long datacenterId;
 46 
 47     public SnowflakeIdWorker(long workerId, long datacenterId) {
 48         if (workerId > maxWorkerId || workerId < 0) {
 49             throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
 50         }
 51         if (datacenterId > maxDatacenterId || datacenterId < 0) {
 52             throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
 53         }
 54         this.workerId = workerId;
 55         this.datacenterId = datacenterId;
 56     }
 57 
 58     // 生成ID
 59     public synchronized long nextId() {
 60         long timestamp = timeGen();
 61 
 62         // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退,抛出异常
 63         if (timestamp < lastTimestamp) {
 64             throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
 65         }
 66 
 67         // 如果时间戳相同,则序列号自增
 68         if (lastTimestamp == timestamp) {
 69             sequence = (sequence + 1) & sequenceMask;
 70             // 序列号溢出,等待下一毫秒
 71             if (sequence == 0) {
 72                 timestamp = tilNextMillis(lastTimestamp);
 73             }
 74         } else {
 75             // 时间戳改变,序列号重置为0
 76             sequence = 0L;
 77         }
 78 
 79         // 更新最后的时间戳
 80         lastTimestamp = timestamp;
 81 
 82         // 移位并通过或运算拼到一起组成64位的ID
 83         return ((timestamp - twepoch) << timestampLeftShift) |
 84                 (datacenterId << datacenterIdShift) |
 85                 (workerId << workerIdShift) |
 86                 sequence;
 87     }
 88 
 89     // 获取当前时间戳
 90     protected long timeGen() {
 91         return System.currentTimeMillis();
 92     }
 93 
 94     // 等待下一个毫秒
 95     protected long tilNextMillis(long lastTimestamp) {
 96         long timestamp = timeGen();
 97         while (timestamp <= lastTimestamp) {
 98             timestamp = timeGen();
 99         }
100         return timestamp;
101     }
102 
103     public static void main(String[] args) {
104         SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1, 1);
105         long start = System.currentTimeMillis();
106         for (int i = 0; i < 100000L; i++) {
107             System.out.println(idWorker.nextId());
108         }
109         System.out.println(System.currentTimeMillis() - start);
110     }
111 }

 

标签:sequence,timestamp,lastTimestamp,private,datacenterId,111,long
From: https://www.cnblogs.com/sys520/p/18560450

相关文章

  • 111
    Python是什么?python是运维晋升的一个趋势python下载地址https://www.python.org/downloads/ python解释器pycharm安装以及激活http://idea.lanyus.com/             获取验证码#!/usr/bin/envpython#_*_coding:utf-8_*_#**author:zhaobin#**des......
  • 1119张杨旭老师讲座
    数字时代,老师做好准备了吗?ai学伴:历史人物模型、心理疗愈大模型提问:跨媒体➕生成新内容(可以在面试时使用)比如古诗教学,学生不理解诗句意思,让学生每个人自行提问大模型生成图片,然后把所有学生提问的图片汇总展示在大屏幕,在提问这些图片的共同点和学生感受思政小课堂“数字素养”......
  • 力扣 LeetCode 111. 二叉树的最小深度(Day7:二叉树)
     解题思路:用后序遍历题目要求的最小深度为根节点到叶子节点的最小深度,注意是到根节点,所以如图所示假设(没有9这个节点)是需要返回3的,而不是1(根节点左子树为空的情况),于是需要加两层判断其余部分可参考求最大深度的思路,有一定相似之处classSolution{publicintminDe......
  • 活着就好20241119
    今天是19号,周二,亲爱的朋友们,大家早上好!在告别了昨天并迎来这个全新而又充满希望的周二早晨,让我们带着周一的余韵,怀揣着新的目标和梦想,继续前行在这美好而又充实的一天里吧!......
  • 241119 noip 模拟赛
    省流:\(100+50+45+32\)。rk8,喜提前十名中唯一没过t2的。T1题意:对于一棵树,记\(f(i)\)表示\(\sum_{1\leqj\leqn}dis(i,j)\),其中\(dis(i,j)\)表示树上\(i,j\)之间的距离。多测,每次给定一个\(x\),你需要找出最小的一个\(n\),使得存在一个\(n\)个点的树,其上存在......
  • 1119鲜花——咸鱼
    我没有任何天分我却有梦的天真也许,现在的我,就是茫茫人海里的一条鱼压力人生中最难熬的几天,停了几个月的课感觉文化课的无力感与OI的压迫感逼的我喘不过来气化学不会,物理没有信心,OI得不到像样的反馈也许一年前的我,还会这样浑浑噩噩即便NOIP近在眼前但是如今不同11月的7,8,9......
  • SS241119C. 甜果(sugar)
    SS241119C.甜果(sugar)题意有\(n\)个人,每个人初始有\(a_i\)颗糖果,有\(n\)个事件,事件\(i\)是如果\(a_i>a_{b_i}\),那么\(a_i':=a_i+w_i\)。问所有事件以随机的排列的顺序依次发生后,每个人的期望糖果数量。思路即求每个事发生的概率\(p_i\),那么\(ans_i=a_i......
  • [20241115]大量软解析相关等待事件分析(21c).txt
    [20241115]大量软解析相关等待事件分析(21c).txt--//测试看看应用程序大量软解析导致的相关等待事件,主要原因上午测试librarycachebucket的muext值的前4个字节,在软解析时会--//出现挂起的情况,其他地方也应该出现类似情况,测试看看主要出现在那里等待事件。1.环境:SCOTT@book01p>......
  • [20241116]大量软解析相关等待事件分析(11g).txt
    [20241116]大量软解析相关等待事件分析(11g).txt--//测试看看应用程序大量软解析导致的相关等待事件,主要原因上午测试librarycachebucket的muext值的前4个字节,在软解析时会--//出现挂起的情况,其他地方也应该出现类似情况,测试看看主要出现在那里等待事件。1.环境:SCOTT@book>@ve......
  • [20241118]invalid date 0000-00-00(zero year)的输入.txt
    [20241118]invaliddate0000-00-00(zeroyear)的输入.txt--//昨天看了链接:https://www.anbob.com/archives/8511.html,类似的问题以前我也遇到过,我记忆里第一次在toad下,如果在浏--//览数据模式,点击显示0000-00-00的grid会报错,提示invaliddate。--//我一直不明白这些日期输入如何......