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

详解分布式ID实践

引言

分布式ID,所谓的分布式ID,就是针对整个系统而言,任何时刻获取一个ID,无论系统处于何种情况,该值不会与之前产生的值重复,之后获取分布式ID时,也不会再获取到与其相同的值,它是一个绝对意义上的全局唯一值。

那么,究竟什么情况下需要用到分布式ID呢?

最经典的场景是分库分表,还是以用户数据来举例子,之前只有一张用户表,所以设置表ID自增后,每新增一条数据都会自增ID值,从而确保了ID永远不会重复。
此刻用户表被分成了十张,如果再依靠数据库本身的自增机制来分配ID,显然会导致ID重复,这时分布式ID就派上了用场。除开分库分表外,通常还会用到分布式ID的场景有:

  • 链路ID:分布式链路中,需要通过全局唯一的traceId来串联所有日志;
  • 请求ID:幂等性处理时,需要通过唯一的ID来判断是否为重复请求;
  • 消息标识:MQ需要基于唯一的msgID来区分数据,确保数据不重复或丢失;
  • 短链码:生成短链接时,需要获取一个全局唯一的值作为Code避免重复;

下面将阐述怎么在项目中实践,为我们的对象生成一个分布式ID

UUID生成

String uuid = UUID.randomUUID().toString();
System.out.println(uuid);/*
* 输出结果:
*   b2c2ec5d-efb9-44c7-b2c8-9cef367c8b3f
* */

通过JDK提供的UUID工具类,一行代码就能生成一个UUID,并且得到的UUID不会重复,怎么保障的呢?UUID的底层,会基于硬件地址(MAC地址)、时间戳和随机因子来生成ID。
世界上没有两片完全相同的叶子,者如这句话一般,世界上也没有两台完全相同的机器,这时硬件地址自然不同,再加上正常情况下不可逆转的时间戳,以及一定范围的随机数,就能确保产生的UUID,其全球唯一性。

雪花算法

雪花算法生成的分布式ID,在Java中会使用Long类型来承载,Long类型占位8bytes,也就正好对应上述这张图的64个比特位,这64bit会被分为四部分:

  • 符号位(1bit):永远为零,表示生成的分布式ID为正数。
  • 时间戳位(2~42bit):会将当前系统的时间戳插入到这段位置。
  • 工作进程位(43~53bit):在集群环境下,每个进程唯一的工作ID
  • 序列号位(54~64bit):该序列是用来在同一个毫秒内生成不同的序列号。
/*
* 雪花算法实现类
* */
public class Snowflake implements Serializable {private static final long serialVersionUID = 1L;// 雪花算法的起始时间纪元public static long DEFAULT_TWEPOCH = 1288834974657L;public static long DEFAULT_TIME_OFFSET = 2000L;// 机器标识所占的位数private static final long WORKER_ID_BITS = 5L;// 数据中心标识所占的位数private static final long DATA_CENTER_ID_BITS = 5L;// 毫秒内的自增位数private static final long SEQUENCE_BITS = 12L;// 机器ID最大值private static final long MAX_WORKER_ID = 31L;// 数据中心ID最大值private static final long MAX_DATA_CENTER_ID = 31L;// 机器ID左移12位private static final long WORKER_ID_SHIFT = 12L;// 数据中心左移17位private static final long DATA_CENTER_ID_SHIFT = 17L;// 毫秒时间戳左移22位private static final long TIMESTAMP_LEFT_SHIFT = 22L;private static final long SEQUENCE_MASK = 4095L;// 雪花ID相关组成部分的定义private final long twepoch;private final long workerId;private final long dataCenterId;private final boolean useSystemClock;private final long timeOffset;private final long randomSequenceLimit;private long sequence;// 最近一次生产ID的时间戳private long lastTimestamp;public Snowflake() {this(IdUtil.getWorkerId(IdUtil.getDataCenterId(31L), 31L));}public Snowflake(long workerId) {this(workerId, IdUtil.getDataCenterId(31L));}public Snowflake(long workerId, long dataCenterId) {this(workerId, dataCenterId, false);}public Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock) {this((Date)null, workerId, dataCenterId, isUseSystemClock);}public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock) {this(epochDate, workerId, dataCenterId, isUseSystemClock, DEFAULT_TIME_OFFSET);}public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long timeOffset) {this(epochDate, workerId, dataCenterId, isUseSystemClock, timeOffset, 0L);}public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long timeOffset, long randomSequenceLimit) {this.sequence = 0L;this.lastTimestamp = -1L;this.twepoch = null != epochDate ? epochDate.getTime() : DEFAULT_TWEPOCH;this.workerId = Assert.checkBetween(workerId, 0L, 31L);this.dataCenterId = Assert.checkBetween(dataCenterId, 0L, 31L);this.useSystemClock = isUseSystemClock;this.timeOffset = timeOffset;this.randomSequenceLimit = Assert.checkBetween(randomSequenceLimit, 0L, 4095L);}public long getWorkerId(long id) {return id >> 12 & 31L;}public long getDataCenterId(long id) {return id >> 17 & 31L;}public long getGenerateDateTime(long id) {return (id >> 22 & 2199023255551L) + this.twepoch;}public synchronized long nextId() {long timestamp = this.genTime();// 解决时钟回拨问题if (timestamp < this.lastTimestamp) {if (this.lastTimestamp - timestamp >= this.timeOffset) {throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", new Object[]{this.lastTimestamp - timestamp}));}timestamp = this.lastTimestamp;}if (timestamp == this.lastTimestamp) {long sequence = this.sequence + 1L & 4095L;if (sequence == 0L) {timestamp = this.tilNextMillis(this.lastTimestamp);}this.sequence = sequence;} else if (this.randomSequenceLimit > 1L) {this.sequence = RandomUtil.randomLong(this.randomSequenceLimit);} else {this.sequence = 0L;}this.lastTimestamp = timestamp;return timestamp - this.twepoch << 22 | this.dataCenterId << 17 | this.workerId << 12 | this.sequence;}public String nextIdStr() {return Long.toString(this.nextId());}private long tilNextMillis(long lastTimestamp) {long timestamp;for(timestamp = this.genTime(); timestamp == lastTimestamp; timestamp = this.genTime()) {}if (timestamp < lastTimestamp) {throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", new Object[]{lastTimestamp - timestamp}));} else {return timestamp;}}private long genTime() {return this.useSystemClock ? SystemClock.now() : System.currentTimeMillis();}
}

上面代码可以直接引用来作为我们的雪花算法工具类

由于原始版雪花算法存在的问题,出现了许多改良版算法,但其核心还是前面聊到的雪花算法,比如百度的Uid-Generator算法、美团的Leaf算法-雪花模式、阿里的Seata框架里的雪花算法实现等等,感兴趣的小伙伴可以自行翻阅源码。

以上就是最常用的实践方式欢迎大家补充

相关文章:

详解分布式ID实践

引言 分布式ID&#xff0c;所谓的分布式ID&#xff0c;就是针对整个系统而言&#xff0c;任何时刻获取一个ID&#xff0c;无论系统处于何种情况&#xff0c;该值不会与之前产生的值重复&#xff0c;之后获取分布式ID时&#xff0c;也不会再获取到与其相同的值&#xff0c;它是…...

Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复

一、日志管理 &#xff08;1&#xff09;基本介绍 日志文件是重要的系统信息文件&#xff0c;记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面&#xff0c;日志也至关重要&#xff0c;它能记录系统日常发生的各类事情&#xff0c;可用于检…...

uniapp中@input输入事件在修改值只有第一次有效的问题解决

在uniapp中使用输入框&#xff0c;要求输入不超过7个字&#xff0c;所以需要监听输入事件&#xff0c;当每次输入文字的时候&#xff0c;就把输入的值截断&#xff0c;取前7个值。但是在input事件中&#xff0c;重新赋值的值发生了变化&#xff0c;但是页面上的还是没有变&…...

单片机 code RO-data RW-data ZI-data以及OTA学习

带着问题去学习&#xff1a;这些数据是什么&#xff1f;分别放在哪里&#xff0c; 是什么&#xff1a;我个人的理解 code 和RO-data 分别是代码和只读数据&#xff0c;RW-data以及ZI-data分别是读写数据和初始化数据。 codeRO-data的大小正好是所占用ROM的大小&#xff0c;RO…...

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号&#xff0c;都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…...

【Deepseek+Dify】wsl2+docker+Deepseek+Dify部署本地大模型知识库问题总结

wsl2dockerDeepseekDify部署本地大模型知识库问题总结 基于ollama部署本地文本模型和嵌入模型 部署教程 DeepSeekdify 本地知识库&#xff1a;真的太香了 问题贴&#xff1a;启动wsl中docker中的dify相关的容器 发现postgre服务和daemon服务一直在重启&#xff0c;导致前端加…...

实战解析传统发电站智能化改造-第二期(带图带教程)

传统发电站的智能化改造&#xff0c;如同为老工匠配备高科技工具&#xff0c;提升效率与精准度。改造后的发电站兼具传统与智能&#xff0c;更高效、环保&#xff0c;适应现代能源需求。智慧系统搭建平台是连接感知层和应用层的桥梁&#xff0c;将原始数据转化为有价值的信息&a…...

鸿蒙5.0实战案例:基于自定义注解和代码生成实现路由框架

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…...

项目设置内网 IP 访问实现方案

在我们平常的开发工作中&#xff0c;项目开发、测试完成后进行部署上线。比如电商网站、新闻网站、社交网站等&#xff0c;通常对访问不会进行限制。但是像企业内部网站、内部管理系统等&#xff0c;这种系统一般都需要限制访问&#xff0c;比如内网才能访问等。那么一个网站应…...

单片机 Bootloade与二进制文件的生成

单片机的 Bootloader 是一种特殊的程序&#xff0c;负责在单片机上电后初始化硬件、更新用户应用程序&#xff08;固件&#xff09;&#xff0c;并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明&#xff1a; 1、单片机 Bootloader 的核心作用 固件更新&…...

open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题

项目地址&#xff1a;GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上&#xff0c;请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…...

深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客Y1中的内容 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金&#xff0c;恶意揣测偷懒用假的结果冒充真实打卡记录&#xff0c;在提出能够拿到视频录像…...

HTML项目一键打包工具:HTML2EXE 最新版

HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件&#xff0c;直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 一、功能特点 类别序号功能标题1支持程序图标自定义&#xff08;支持…...

网络工程师 (43)IP数据报

前言 IP数据报是互联网传输控制协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;的数据报格式&#xff0c;由首部和数据两部分组成。 一、首部 IP数据报的首部是控制部分&#xff0c;包含了数据报传输和处理所需的各种信息。首部可以分为固定部分和可变部分。 固定…...

springboot-自定义注解

1.注解的概念 注解是一种能被添加到java代码中的【元数据&#xff0c;类、方法、变量、参数和包】都可以用注解来修饰。用来定义一个类、属性或一些方法&#xff0c;以便程序能被捕译处理。 相当于一个说明文件&#xff0c;告诉应用程序某个被注解的类或属性是什么&#xff0c…...

Pytorch实现之特征损失与残差结构稳定GAN训练,并训练自己的数据集

简介 简介:生成器和鉴别器分别采用了4个新颖设计的残差结构实现,同时在损失中结合了鉴别器层的特征损失来提高模型性能。 论文题目:Image Generation by Residual Block Based Generative Adversarial Networks(基于残留块的生成对抗网络产生图像) 会议:2022 IEEE Int…...

微信小程序模仿快播标签云滚动特效

说到快播&#xff0c;故事肯定就不少。用过的人都知道快播首页有个标签云的特效效果&#xff0c;就是渐隐渐显外加上下滚动&#xff0c;其实还挺好看的。至于其他故事嘛&#xff0c;因为没有酒&#xff0c;所以&#xff0c;还是来说说代码吧~ 一开始不是做这个特效需求&#xf…...

XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译

XUnity.AutoTranslator-deepseek 本项目通过调用腾讯的DeepSeek V3 API&#xff0c;实现Unity游戏中日文文本的自动翻译。 准备工作 1. 获取API密钥 访问腾讯云API控制台申请DeepSeek的API密钥&#xff08;限时免费&#xff09;。也可以使用其他平台提供的DeepSeek API。 …...

对比机器学习揭示了跨物种共享与特异性的脑功能结构|文献速递-医学影像人工智能进展

Title 题目 Contrastive machine learning reveals species -shared and -specific brainfunctional architecture 对比机器学习揭示了跨物种共享与特异性的脑功能结构 01 文献速递介绍 猕猴作为人类的动物模型&#xff0c;广泛用于研究大脑和行为的关键方面&#xff08;G…...

Vue 和 React 响应式的区别

React 和 Vue 在响应式机制上的核心区别主要体现在数据变化侦测方式、更新触发逻辑和设计理念上&#xff0c;具体如下&#xff1a; 一、数据变化侦测方式 Vue 的响应式 原理&#xff1a;通过 Proxy&#xff08;Vue3&#xff09;或 Object.defineProperty&#xff08;Vue2&#…...

MySQL主从架构

MySQL主从架构 MySQL REPLICATION 在实际生产环境中&#xff0c;如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性&#xff0c;还是高并发等各个方面都是完全不能满足实际需求的&#xff0c;因此&#xff0c;一般来说都是通过主从复制&#xff08;…...

基于ros2与gazebo的导航仿真案例

文章目录 前言操作1、创建docker容器2、安装ROS23、Gazebo安装4、Nav2安装5、测试 前言 导航的入门小案例 参考&#xff1a; Ubuntu24.04 ROS2 Jazzy Gazebo Harmonic安装教程Docs / Gazebo Harmonic 注意选择版本 ROS 2 documentation 操作 1、创建docker容器 sudo docke…...

《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

《Python实战进阶》专栏 第3集&#xff1a;Django 项目结构解析与入门DEMO 在本集中&#xff0c;我们将深入探讨 Django 的项目结构&#xff0c;并实际配置并运行一个入门DEMO博客网站&#xff0c;帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…...

基于WebGIS技术的校园地图导航系统架构与核心功能设计

本文专为IT技术人员、地理信息系统&#xff08;GIS&#xff09;开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案&#xff0c;旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…...

开源且免费的CMS系统有哪几个可以放心用?

既开源又免费的两全其美的CMS不多见&#xff0c;不过总会存在一些个例&#xff0c;给用户们带来更具有建设性的选择&#xff0c;以下是一些开源免费且值得信赖的CMS系统&#xff0c;可以根据你的需求选择合适的平台&#xff1a; 1、WordPress ▷ 特点&#xff1a;全球最流行的…...

逻辑架构与软件架构在PREEvision中的设计关系

1 Introduction 在如今汽车电子系统的开发过程中&#xff0c;系统架构设计是至关重要的环节。无论是汽车控制系统、信息娱乐系统&#xff0c;还是电动驱动系统&#xff0c;架构设计都决定了整个系统的功能、性能以及后期的可维护性和可扩展性。 在往期文章中&#xff0c;我们…...

DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?

一、引言 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已然成为推动各领域变革的核心力量。而在人工智能的众多分支中&#xff0c;自然语言处理&#xff08;NLP&#xff09;因其与人类日常交流和信息处理的紧密联系&#xff0c;成为了最受瞩目的领…...

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能&#xff0c;每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容&#xff0c;屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便&#xff0c;而…...

AF3 _process_single_hit 函数解读

AlphaFold3 中templates模块的_process_single_hit函数处理单个 HHsearch 比对的模板 TemplateHit,并从相应的 mmCIF 文件中提取模板特征,返回包含模板位置信息、比对质量等特征的 SingleHitResult 对象。它是 AlphaFold3 在模板模块中生成模板特征结构输入的重要步骤。 源代…...

go 模块管理

go version 查看版本 go version go1.21.12 windows/amd64 需要保证:go的版本升级为1.11以上,go mod依赖的最底版本 go env 查看go的环境变量 go env 开启go mod # 标识开启go的模块管理 set GO111MODULE=on GO111MODULE有三个值:off, on和auto(默认值)。 GO111M…...

23种设计模式 - 命令模式

模式定义 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为独立对象&#xff0c;使请求的发送者与接收者解耦。通过将操作抽象为命令对象&#xff0c;支持命令的存储、传递、撤销和重做&#xff0c;增强系统的灵活性和可扩展性…...

php-fpm

摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器&#xff0c;管理PHP的FastCGI进程&#xff0c;提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器&#xff0c;提供了更好的php进程管理方式&#xff0c;可以有效的控制内存和进程&#xff0c;支…...

Visual Studio 2022配置网址参考

代码格式化和清理冗余代码选项的配置&#xff1a; 代码样式选项和代码清理 - Visual Studio (Windows) | Microsoft Learn 调试时传递参数&#xff1a; 调试时传递命令行参数&#xff08;C&#xff09; - Visual Studio (Windows) | Microsoft Learn...

【含文档+PPT+源码】基于Django的新闻推荐系统的设计与实现

项目介绍 本课程演示的是一款基于Django的新闻推荐系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…...

2025年02月21日Github流行趋势

项目名称&#xff1a;source-sdk-2013 项目地址url&#xff1a;https://github.com/ValveSoftware/source-sdk-2013项目语言&#xff1a;C历史star数&#xff1a;7343今日star数&#xff1a;929项目维护者&#xff1a;JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...

后端开发:开启技术世界的新大门

在互联网的广阔天地中&#xff0c;后端开发宛如一座大厦的基石&#xff0c;虽不直接与用户 “面对面” 交流&#xff0c;却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域&#xff0c;负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...

Apache Doris 实现毫秒级查询响应

1. 引言 1.1 数据分析的重要性 随着大数据时代的到来,企业对实时数据分析的需求日益增长。快速、准确地获取数据洞察成为企业在竞争中脱颖而出的关键。传统的数据库系统在处理大规模数据时往往面临性能瓶颈,难以满足实时分析的需求。例如,一个电商公司需要实时监控销售数据…...

【Python项目】基于Python的语音数据及标注核对审核系统

【Python项目】基于Python的语音数据及标注核对审核系统 技术简介&#xff1a; 采用Python技术、MySQL数据库、Django框架等实现。 系统简介&#xff1a; 语音数据及标注核对审核系统是一个基于B/S架构的语音数据处理平台&#xff0c;旨在通过自动化的方式对语音数据进行标…...

路由基本配置

学习目标 • 根据拓扑图进行网络布线。 • 清除启动配置并将路由器重新加载为默认状态。 • 在路由器上执行基本配置任务。 • 配置并激活以太网接口。 • 测试并检验配置。 • 思考网络实施方案并整理成文档。 任务 1&#xff1a;网络布线 使用适当的电缆类型连接网络设备。…...

从WebRTC到EasyRTC:嵌入式适配的视频通话SDK实现低延迟、高稳定性音视频通信

WebRTC最初是为浏览器之间的实时通信设计的&#xff0c;其资源需求和复杂性可能对嵌入式设备的性能提出较高要求&#xff0c;因此在嵌入式系统中应用时面临一些挑战&#xff1a; 1&#xff09;资源消耗较高 CPU和内存占用&#xff1a;WebRTC是一个功能强大的实时通信框架&…...

【Blender】二、建模篇--05,阵列修改器与晶格形变

阵列修改器是bender里面一个比较常用的修改器,所以我们单独开口来讲,我们会先从几片树叶出发,然后我们用阵列修改器把这几片树叶变成这样的造型和这样的造型。这两个造型分别就代表着阵列修改器最常用的两种偏移方法,我们现在就开始我们先来做几个树叶。 1.树叶建模 首先…...

Python爬虫实战:获取12306特定日期、城市车票信息,并做数据分析以供出行参考

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 核心思路 需求:获取明天(2025 年 2 月 21 日)从北京到上海的车次、票价、出发时间、硬卧二等卧信息,并保存到 CSV 文件,然后分析出价格最低的 10 趟车次。目…...

C++ 设计模式-策略模式

支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基础策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…...

数据结构:哈希表(unordered_map)

unordered_map 是 C 标准库中的一种哈希表实现&#xff0c;它提供了基于键值对&#xff08;key-value&#xff09;的存储&#xff0c;提供了常数时间复杂度的查找、插入和删除键值对的操作。 初始化代码示例&#xff1a; #include <unordered_map> using namespace std…...

鸿蒙-自定义布局-实现一个可限制行数的-Flex

文章目录 前提onMeasureSizeselfLayoutInfoconstraintchildren onPlaceChildren 实现思路属性准备测量组件布局小结 刷新 千呼万唤始出来的自定义布局功能终于可以用了&#xff0c;这就给了我们更多自由发挥创造的空间&#xff0c;不再局限于使用已有组件做组合。当然&#xff…...

安装可视化jar包部署平台JarManage

一、下载 下载地址&#xff1a;JarManage 发行版 - Gitee.com &#x1f692; 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器&#xff0c;解压进入目录 &#x1f69a; 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...

1、Window Android 13模拟器 将编译的映像文件导入Android Studio

1、环境准备 编译环境&#xff1a;Ubuntu-18.04.5编译版本&#xff1a;android13-release下载地址&#xff1a;清华大学开源软件镜像站AOSP # 下载repo # 同步代码&#xff1a;repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…...

力扣27. 移除元素(快慢指针)

Problem: 27. 移除元素 文章目录 题目描述思路Code 题目描述 思路 定义快慢指针均指向数组起始位置&#xff0c;当fast指针指向的元素不等于val时将fast指针指向的元素赋值给slow并让slow指针向前移动&#xff0c;fast指针一直向前移动 时间复杂度: O ( n ) O(n) O(n); 空间复杂…...

Unity学习part4

1、ui界面的基础使用 ui可以在2d和矩形工具界面下操作&#xff0c;更方便&#xff0c;画布与游戏窗口的比例一般默认相同 如图所示&#xff0c;图片在画布上显示的位置和在游戏窗口上显示的位置是相同的 渲染模式&#xff1a;屏幕空间--覆盖&#xff0c;指画布覆盖在游戏物体渲…...

前端面试之Flex布局:核心机制与高频考点全解析

目录 引言&#xff1a;弹性布局的降维打击 一、Flex布局的本质认知 1. 两大核心维度 2. 容器与项目的权力边界 二、容器属性深度剖析 1. 主轴控制三剑客 2. 交叉轴对齐黑科技 三、项目属性关键要点 1. flex复合属性解密 2. 项目排序魔法 四、六大高频面试场景 1. 经…...