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

泰安北京网站建设舒城县重点工程建设局网站

泰安北京网站建设,舒城县重点工程建设局网站,网站建设前端需要看什么书,学网络营销去哪个学校#xff08;全局唯一ID的解决方案有很多种#xff0c;这里主要是介绍和学习Snowflake算法#xff09; 什么是雪花算法#xff08;Snowflake#xff09; 雪花算法#xff08;Snowflake Algorithm#xff09;是由Twitter公司在2010年左右提出的一种分布式ID生成算法全局唯一ID的解决方案有很多种这里主要是介绍和学习Snowflake算法 什么是雪花算法Snowflake 雪花算法Snowflake Algorithm是由Twitter公司在2010年左右提出的一种分布式ID生成算法主要用于生成全局唯一且趋势递增的ID。这种算法生成的ID是一个64位的长整型数字具有很高的性能与扩展性特别适合于分布式环境下的主键生成场景比如数据库表主键、消息队列的Message ID等。 实现原理 Snowflake算法的原理主要体现在它生成64位ID的结构上主要划分为如下几个部分 0 | 00000000000000000000000000000000000000000 | 00000 | 00000 | 000000000000 1bit-符号位 第1位通常固定为0表示生成的ID都是正数。 41bit-时间戳部分 从第2位到第42位共41位存储时间戳信息精确到毫秒级别。时间戳可以是自定义的一个起始时间点如Twitter使用的是2010-11-04的某一时刻这样可以通过比较ID中的时间戳部分来判断事件发生的先后顺序。41位的时间截可以使用69年年T (1L 41) / (1000L * 60 * 60 * 24 * 365) 69。 10bit-工作机器ID(5bit数据中心ID5bit机器ID) 从第43位到第52位共10位存储工作机器ID或者数据中心ID。这部分可以进一步细分为两部分例如前5位标识数据中心ID后5位标识工作节点ID。这样可以支持32(0~31)个数据中心以及每个数据中心内部的32(0~31)个工作节点足够覆盖大规模分布式系统的节点标识。 12bit-序列号部分 从第53位到第64位共12位存储同一节点同一毫秒内生成的序列号这意味着同一个节点在同毫秒内可以生成最多4096个不同的ID2^12。 当生成ID时首先获取当前时间戳然后加上工作节点ID以及序列号。如果在同一毫秒内有新的请求则序列号加1。若序列号达到最大值则等待下一毫秒再进行分配从而确保在同一节点内生成的ID是唯一的 雪花算法的优缺点 优点 全局唯一性雪花算法生成的ID是全局唯一的这在分布式系统中非常重要可以避免因ID冲突而导致的数据不一致问题。 递增有序由于ID中包含时间戳部分所以生成的ID是递增有序的。这有助于数据库插入性能的优化因为有序的ID可以减少数据库的页分裂提高写入效率。 灵活性雪花算法允许自定义配置工作机器ID和数据中心ID的位数可以根据实际部署环境调整这些配置以支持不同规模的分布式系统。 高效性算法本身实现简单生成ID的速度快能够满足高并发场景下的需求。 缺点 时钟依赖雪花算法依赖于系统时钟来生成时间戳部分。如果系统时钟出现回拨或漂移可能会导致生成的ID不唯一或有序性受到破坏。虽然可以通过一些机制来处理时钟回拨问题但时钟漂移仍然是一个潜在的风险。 机器ID冲突如果部署的工作节点数量超过了算法中定义的机器ID位数所能表示的范围就会发生机器ID冲突。这需要在设计系统时预先规划好机器ID的分配和管理。 缺乏安全性雪花算法生成的ID本身并不包含加密或签名信息因此容易受到恶意篡改。如果ID的安全性要求较高需要在生成ID后添加额外的加密或签名措施。 扩展性限制由于雪花算法的ID结构是固定的因此在某些情况下可能会受到扩展性的限制。例如如果未来需要添加更多的元数据到ID中或者需要支持更大的分布式系统规模可能需要重新设计ID生成算法。 因此为了更全面地解决雪花算法的缺陷问题可能需要采取额外的措施例如 增强时钟同步使用NTPNetwork Time Protocol或其他时钟同步机制来确保各个节点之间的时钟尽可能准确同步。 增加机器ID的灵活性设计一种更灵活的方式来分配和管理机器ID以便支持更多的工作节点和数据中心。 安全性考虑对生成的ID进行加密或签名以防止恶意篡改。 综上所述雪花算法在分布式系统中具有广泛的应用价值其全局唯一性和递增有序性使得它成为生成唯一ID的优选方案之一。然而在使用雪花算法时也需要注意其潜在的缺点并根据实际需求进行配置和优化。 Snowflake算法生成ID的Java代码示例 以下是Snowflake算法的一个java简化版实现 public class SnowflakeIdWorker { // 起始的时间戳自定义例如系统上线时间 private final long twepoch 1288834974657L; // 机器id所占的位数 private final long workerIdBits 5L; // 数据标识id所占的位数 private final long datacenterIdBits 5L; // 最大机器ID private final long maxWorkerId -1L ^ (-1L workerIdBits); // 最大数据标识ID private final long maxDatacenterId -1L ^ (-1L datacenterIdBits); // 序列在id中占的位数 private final long sequenceBits 12L; // 机器ID左移12位 private final long workerIdShift sequenceBits; // 数据标识id左移17位(125) private final long datacenterIdShift sequenceBits workerIdBits; // 时间截左移22位(5512) private final long timestampLeftShift sequenceBits workerIdBits datacenterIdBits; // 序列的掩码这里为4095 (0b1111111111114095) private final long sequenceMask -1L ^ (-1L sequenceBits); // 上次生成ID的时间截 private long lastTimestamp -1L; // 序列号 private long sequence 0L; // 工作机器ID private final long workerId; // 数据中心ID private final long datacenterId; public SnowflakeIdWorker(long workerId, long datacenterId) { if (workerId maxWorkerId || workerId 0) { throw new IllegalArgumentException(String.format(worker Id cant be greater than %d or less than 0, maxWorkerId)); } if (datacenterId maxDatacenterId || datacenterId 0) { throw new IllegalArgumentException(String.format(datacenter Id cant be greater than %d or less than 0, maxDatacenterId)); } this.workerId workerId; this.datacenterId datacenterId; } // 生成ID public synchronized long nextId() { long timestamp timeGen(); // 如果当前时间小于上一次ID生成的时间戳说明系统时钟回退抛出异常 if (timestamp lastTimestamp) { throw new RuntimeException(String.format(Clock moved backwards. Refusing to generate id for %d milliseconds, lastTimestamp - timestamp)); } // 如果时间戳相同则序列号自增 if (lastTimestamp timestamp) { sequence (sequence 1) sequenceMask; // 序列号溢出等待下一毫秒 if (sequence 0) { timestamp tilNextMillis(lastTimestamp); } } else { // 时间戳改变序列号重置为0 sequence 0L; } // 更新最后的时间戳 lastTimestamp timestamp; // 移位并通过或运算拼到一起组成64位的ID return ((timestamp - twepoch) timestampLeftShift) | (datacenterId datacenterIdShift) | (workerId workerIdShift) | sequence; } // 获取当前时间戳 protected long timeGen() { return System.currentTimeMillis(); } // 等待下一个毫秒 protected long tilNextMillis(long lastTimestamp) { long timestamp timeGen(); while (timestamp lastTimestamp) { timestamp timeGen(); } return timestamp; }public static void main(String[] args) { SnowflakeIdWorker idWorker new SnowflakeIdWorker(1, 1); for (int i 0; i 5; i) { long id idWorker.nextId(); System.out.println(Long.toBinaryString(id)); System.out.println(id); } } } 代码输出 这段代码实现了雪花算法的核心逻辑。在nextId()方法中它首先获取当前时间戳然后检查时间戳是否小于上一次生成ID时的时间戳如果是则抛出异常因为这意味着系统时钟回退可能会导致ID生成出现混乱。如果时间戳相同则序列号自增并检查是否溢出如果溢出则等待下一个毫秒。如果时间戳不同则重置序列号。最后将时间戳、数据中心ID、机器ID和序列号按照各自的偏移量左移然后进行位或运算组合成一个64位的ID。 注关于数据中心ID、机器ID根据实际情况来进行配置。
http://www.zqtcl.cn/news/82083/

相关文章:

  • 向百度提交网站如何把动态图发网站做头像
  • 营销型网站建设 合肥莆田高端模板建站
  • 担路网如何快速做网站网站建设 开发工具 python
  • 北京网站建设培训机构微信订阅号关键网站
  • 广州网站定做教程建立健全()和安全生产规章制度
  • 岐山县住房和城市建设局网站网站 简单
  • 字体设计海报网站seo是啥
  • 网站建设搜狐东莞阳光网官方网站
  • 网站建设上线问题网站开发软件科技公司
  • 网站模板库免费福建住房和城乡建设厅网站一体化平台
  • 合肥专业的房产网站建设福田欧曼服务站
  • wordpress 文章表格网站免费优化
  • 小学学校网站模板百度seo关键词排名技术
  • 推广网站案例网站宣传费用
  • 网站标题怎么隔开学做网站用什么服务器
  • 深圳网站设计哪家强河南新冠防控
  • 衡水企业网站建设深圳网站建设报价
  • 网站开发 业务流程图网站书店架构书怎么做
  • 犀牛云网站建设费用比亚迪新能源汽车报价大全一览表
  • 网站改版前端流程经验河源新闻头条最新新闻
  • 企业标准网站模板电商网站网络服务
  • 湖南响应式网站建设wap网站建设公司
  • 企业网站源码 vue网站开发群
  • 北京网站备案核验单vs2010网站设计用整张图片做背景
  • 高端品牌网站定制设计网站建设的基本原则
  • 网站二级目录怎么做开发wordpress 需要学习
  • 产品网站建设公司哪家好网站建设路由器怎么设置
  • 网站营销设计免费域名申请 tk
  • 海北公司网站建设价格低通州区住房和城乡建设部网站
  • 微信设计网站wordpress的tag404页面