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

做网站好一点的软件厦门网站建设门户

做网站好一点的软件,厦门网站建设门户,我为群众办实事工作总结,服装网站建设开发语言欢迎来到本次博客的旅程#xff0c;今天我们要揭开一个神秘算法的面纱#xff0c;它就是在分布式系统中广受欢迎的——雪花算法#xff08;Snowflake#xff09;。这个算法不是用来预测雪花的形状#xff0c;而是用来生成唯一的ID#xff0c;保证在分布式系统中#xff…欢迎来到本次博客的旅程今天我们要揭开一个神秘算法的面纱它就是在分布式系统中广受欢迎的——雪花算法Snowflake。这个算法不是用来预测雪花的形状而是用来生成唯一的ID保证在分布式系统中每一个ID都是独一无二的。接下来我将带领大家一步一步深入了解这个神奇的算法并教你如何在Java中实现它。准备好了吗让我们开始吧 一、什么是雪花算法 雪花算法由Twitter在2010年发布用于生成分布式系统中的唯一ID。想象一下你有一大片雪花每一片都独一无二这就是雪花算法的工作原理。它生成的ID不仅唯一还按时间有序。 雪花算法生成的ID是一个64位的整数这个整数由以下几部分组成 1位的符号位总是0表示正数。41位的时间戳精确到毫秒可以使用约69年。10位的机器ID表示最多支持1024个节点。12位的序列号每毫秒可以生成4096个不同的ID。 这样组合在一起就形成了一个唯一的ID。 二、为什么要用雪花算法 在分布式系统中生成唯一的ID是一个常见问题。常见的方法有UUID和数据库自增ID但它们都有各自的缺点 UUID虽然唯一但长度较长不利于存储和索引。数据库自增ID需要依赖数据库不利于分布式扩展。 相比之下雪花算法生成的ID短小精悍按时间有序非常适合在分布式系统中使用。 三、雪花算法的工作原理 让我们通过一个示例详细了解雪花算法是如何工作的。 假设我们在2024年1月1日开始使用雪花算法生成ID机器ID为1每毫秒生成的序列号从0开始。 获取当前时间戳获取当前时间戳以毫秒为单位减去一个固定的时间起点例如2024年1月1日的时间戳得到时间差。拼接机器ID和序列号将机器ID和序列号拼接在时间戳之后形成一个64位的ID。 举个例子如果当前时间戳是1000毫秒机器ID是1序列号是0那么生成的ID就是 ID 时间戳 22 | 机器ID 12 | 序列号 1000 22 | 1 12 | 0 4194304000四、Java实现雪花算法 接下来我们在Java中实现雪花算法。这个实现包含了基本的ID生成逻辑以及一些必要的同步控制确保在高并发环境下的正确性。 public class SnowflakeIdGenerator {// 起始时间戳private final long twepoch 1577836800000L; // 2020-01-01// 机器ID所占的位数private final long workerIdBits 5L;// 数据中心ID所占的位数private final long datacenterIdBits 5L;// 支持的最大机器IDprivate final long maxWorkerId -1L ^ (-1L workerIdBits);// 支持的最大数据中心IDprivate final long maxDatacenterId -1L ^ (-1L datacenterIdBits);// 序列在ID中占的位数private final long sequenceBits 12L;// 机器ID向左移12位private final long workerIdShift sequenceBits;// 数据中心ID向左移17位private final long datacenterIdShift sequenceBits workerIdBits;// 时间戳向左移22位private final long timestampLeftShift sequenceBits workerIdBits datacenterIdBits;// 生成序列的掩码这里为4095private final long sequenceMask -1L ^ (-1L sequenceBits);private long workerId; // 机器IDprivate long datacenterId; // 数据中心IDprivate long sequence 0L; // 序列号private long lastTimestamp -1L; // 上次生成ID的时间戳// 构造函数public SnowflakeIdGenerator(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;}// 生成IDpublic synchronized long nextId() {long timestamp timeGen();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 {sequence 0L;}lastTimestamp timestamp;return ((timestamp - twepoch) timestampLeftShift) |(datacenterId datacenterIdShift) |(workerId workerIdShift) |sequence;}// 阻塞到下一个毫秒直到获得新的时间戳protected long tilNextMillis(long lastTimestamp) {long timestamp timeGen();while (timestamp lastTimestamp) {timestamp timeGen();}return timestamp;}// 返回当前时间以毫秒为单位protected long timeGen() {return System.currentTimeMillis();} }以上代码中SnowflakeIdGenerator 类实现了雪花算法的核心逻辑。让我们来逐步解释每一个部分。 变量定义定义了机器ID、数据中心ID、序列号以及时间戳等变量。构造函数初始化机器ID和数据中心ID并进行合法性检查。nextId 方法生成唯一ID使用同步关键字保证线程安全。tilNextMillis 方法阻塞直到下一毫秒以防止生成重复ID。timeGen 方法获取当前时间戳。 五、使用示例 现在我们可以创建 SnowflakeIdGenerator 的实例并生成唯一ID了。 public class Main {public static void main(String[] args) {SnowflakeIdGenerator idGenerator new SnowflakeIdGenerator(1, 1);for (int i 0; i 10; i) {long id idGenerator.nextId();System.out.println(Generated ID: id);}} }以上代码将生成10个唯一ID并打印到控制台。 六、结论 雪花算法在分布式系统中生成唯一ID方面表现卓越。通过详细的解释和Java实现希望你已经掌握了这个强大的工具。无论你是在开发大型分布式系统还是需要生成唯一ID雪花算法都是一个值得信赖的选择。 希望这篇博客不仅帮助你理解了雪花算法还能让你在实现过程中获得乐趣。如果你有任何问题或建议欢迎在评论区留言我们一起探讨 祝编码愉快
http://www.dnsts.com.cn/news/201624.html

相关文章:

  • 网站怎么做rss做电影网站赚钱么
  • 网站建设怎么报印花税手机网站建设 新闻
  • 大连微网站建设网站建设公司 预算
  • 网站建设的流程分析福州建设公司名单
  • 网站域名 过期重庆旅游网站建设规划
  • 做网站要素phpcms 怎么做视频网站首页
  • 有后台的网站怎么做合肥微网站建设
  • 商丘手机网站建设国内网站空间
  • 适合网站参加的培训班免费开店平台
  • 徐州手机网站建设公司哪家好seo怎么搞
  • 购物券网站怎么做深圳市招投标交易中心
  • 创建网站无法播放视频汕头吧 百度贴吧
  • 专做阀门网站广州公共交易中心
  • 洛阳市涧西区建设局网站怎样成立网站
  • phpmysql网站开发全程实例 第2版网站建设自建与租用区别
  • 建设集团网站 技术支持中企动力国内建站平台排名
  • wordpress建站容易吗长沙需要做网站的企业
  • 代理公司注册价格seo网站诊断分析报告
  • 建筑工具网站关键词筛选工具
  • 太原市建设厅网站山西网站建设公司排名
  • 宁波做网站seo格尔木市建设局网站
  • 免费自己生成网站建立的意思
  • 如何设计营销 网站建设制作一个网站需要哪些步骤
  • 虚拟主机如何做多个网站大型外包公司有哪些
  • 旅行社营业网点可以做网站吗贵州省建设执业资格教育促进会网站
  • 网站商城如何获取流量帮我搜一下长沙做网络销售
  • 微网站的优势建站网址大全
  • 网站建设与管理工作内容好动词做的网站能行吗
  • 长治网站开发泉州企业网站制作哪家好
  • 网站代备案公司软件分销系统开发