SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID?
数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。
数据完整性:通过使用唯一ID,可以保证数据库中的数据完整性。例如,在关系数据库中,外键通常引用主表的唯一ID,以建立和维护表之间的关联。
高效查询:唯一ID通常是索引的一部分,这意味着使用它们进行查询可以非常快速和高效。这对于提高应用程序性能特别重要,尤其是在处理大量数据时。
简化逻辑处理:拥有一个唯一的标识符可以简化很多业务逻辑的处理。例如,当需要引用或共享特定数据项时,唯一ID提供了一个简单而直接的方法。
分布式系统支持:在分布式系统或微服务架构中,唯一ID(特别是全局唯一ID)是必不可少的。它们允许不同的服务能够独立生成不冲突的ID,从而简化了跨服务的数据整合和通信问题。
易于扩展和维护:随着系统的发展和需求的变化,唯一ID使得添加新功能或者修改现有功能变得更加容易。例如,重构数据库结构时,唯一ID可以帮助更平滑地迁移数据。
2.生成唯一ID的基本要求
唯一性
:这是最基本的要求,即生成的ID在整个系统中必须是独一无二的。特别是在分布式系统中,需要确保不同节点生成的ID也不会发生冲突。
全局唯一性(如果适用):在某些场景下,如分布式系统或微服务架构中,可能需要ID不仅在同一数据库或系统内唯一,而且在所有相关的系统和数据库中也保持唯一。
不可预测性
:为了安全考虑,尤其是在涉及用户敏感信息或重要业务逻辑时,ID应该是难以预测的。这可以防止恶意猜测或其他安全问题。
顺序性(如果需要):有些应用可能需要ID有一定的顺序性,例如按时间顺序排列,以便于排序、分页等操作。但需要注意的是,严格的顺序性可能会对系统的扩展性和性能造成影响。
高效性:生成ID的过程应该尽可能快速且消耗资源少,以避免成为系统性能瓶颈。
长度适中
:ID的长度应该适中,既能保证足够的空间来确保唯一性,又不至于过长导致存储和传输效率降低。
兼容性:生成的ID应与现有的系统和协议兼容,不会因为格式或编码问题而引起错误。
可扩展性
:随着系统的发展和规模的增长,生成ID的方法应能方便地进行扩展,以适应更高的需求。
3.常见生成方法
- UUID(通用唯一识别码)
基于时间的UUID(Version 1):结合时间戳和MAC地址生成。
基于随机数的UUID(Version 4):使用随机数生成。
基于命名空间的UUID(Version 3 和 5):基于命名空间和名称的哈希值生成。
优点:
全局唯一性
:UUID的设计保证了在全球范围内的唯一性,适用于分布式系统。
无需中央协调
:无需依赖数据库或其他中央服务生成ID,减少了系统复杂性。
生成速度快
:基于随机数的UUID生成速度非常快,适用于高并发场景。缺点:
长度较长
:UUID长度为128位,通常表示为36个字符(包括连字符),这在存储和传输时占用较多空间。例如,在数据库中存储UUID会比存储整数类型占用更多的空间。
无序性
:UUID通常是随机生成的,缺乏时间上的顺序性。这在数据库索引中可能导致性能问题,因为插入操作可能需要在B树索引中频繁分裂节点。
可读性差
:UUID对人类不友好,难以记忆和识别,不利于在用户界面或日志中直接使用。
缺乏业务相关性
:UUID不包含任何业务信息,如时间戳或区域信息,难以用于业务分析和追踪。
- 适用场景
- 分布式系统:在多节点、多数据中心的环境中,UUID是生成唯一标识符的理想选择。
- 无需排序的场景:如果不需要按时间或其他顺序对ID进行排序,UUID是一个不错的选择。
- 高并发环境:UUID的生成速度非常快,适用于需要快速生成唯一标识符的高并发场景。
数据库自增ID是一种常见的生成唯一标识符的方法,通过在数据库表中设置自增字段(如
AUTO_INCREMENT
),每次插入新记录时,数据库会自动为该字段生成一个唯一的、递增的整数。
优点:
简单易用:实现简单,只需在数据库表中设置自增字段,无需额外的代码或配置。
有序性:自增ID是有序的,有利于数据库索引的性能,特别是在使用B树索引时。
节省存储空间:整数类型的ID通常比UUID占用更少的存储空间。
可读性较好:整数ID对人类相对友好,易于识别和记忆。
缺点:
单点瓶颈:在分布式数据库环境中,自增ID难以保证全局唯一性,通常需要依赖单个数据库实例来生成ID,这会成为系统的单点瓶颈,影响性能和可扩展性。
难以水平扩展:如果系统需要水平扩展到多个数据库实例,自增ID的生成会成为问题,因为每个实例都会生成自己的ID序列,导致ID冲突。
依赖数据库:生成ID依赖于数据库,这在数据库故障或高负载时可能成为问题。
缺乏业务相关性:自增ID不包含任何业务信息,如时间戳或区域信息,难以用于业务分析和追踪。
- 适用场景
- 单体应用:在单体应用中,数据库自增ID是一个简单且有效的方法。
- 无需分布式唯一性的场景:如果系统不需要在多个数据库实例或多个数据中心中保持全局唯一性,自增ID是一个不错的选择。
- 对ID有序性有要求的场景:如果需要按时间或其他顺序对ID进行排序,自增ID的有序性是一个优势。
4.雪花算法的实现过程如下
获取当前时间戳,精确到毫秒级别。
根据给定的数据中心ID和机器ID,生成一个10位的二进制数。
将时间戳左移22位,将数据中心ID左移17位,将机器ID左移12位,然后使用位或操作符将它们组合成一个64位的二进制数。
如果在同一毫秒内生成了多个ID,使用序列号来区分它们,序列号从0开始递增,最多可以生成4096个序列号。
优点
:全局唯一性:在分布式系统中,雪花算法可以确保生成的ID全局唯一。
有序性:生成的ID按照时间戳有序递增,便于数据管理和查询。
高并发:每毫秒可以生成4096个ID,适合高并发场景。
缺点
:依赖服务器时间:如果服务器时间回拨,可能会导致生成重复的ID。可以通过记录最后一个生成ID的时间戳来解决这个问题。
序列号浪费:在分库分表时,如果序列号一直从0开始,可能会导致数据倾斜和不均匀分布。
`适用场景
:分布式系统:如分布式数据库、分布式锁等,需要全局唯一且有序的ID。
高并发场景:如订单号生成、用户ID生成等
- 实现代码
public class SnowflakeIdGenerator {// 开始时间戳 (2023-01-01)private final long twepoch = 1672502400000L;// 机器ID所占的位数private final long workerIdBits = 5L;// 数据标识ID所占的位数private final long datacenterIdBits = 5L;// 支持的最大机器ID,结果是31 (这个值在位运算中不会溢出)private final long maxWorkerId = -1L ^ (-1L << workerIdBits);// 支持的最大数据标识ID,结果是31private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);// 序列号在ID中所占的位数private final long sequenceBits = 12L;// 机器ID需要左移的位数,12private final long workerIdShift = sequenceBits;// 数据标识ID需要左移的位数,17private final long datacenterIdShift = sequenceBits + workerIdBits;// 时间戳需要左移的位数,22private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;// 生成序列的掩码,这里为4095 (0b111111111111=4095)private final long sequenceMask = -1L ^ (-1L << sequenceBits);// 工作机器ID(0~31)private long workerId;// 数据中心ID(0~31)private long datacenterId;// 毫秒内序列(0~4095)private long sequence = 0L;// 上次生成ID的时间戳private long lastTimestamp = -1L;public SnowflakeIdGenerator(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't 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 {// 时间戳改变,毫秒内序列重置sequence = 0L;}// 上次生成ID的时间截lastTimestamp = timestamp;// 移位并通过或运算拼到一起组成64位的IDreturn ((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();}
}
相关文章:
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
认识时钟树
时钟源 高速外部震荡器HSE 低速外部震荡器LSE 高速内部震荡器HSI 低速内部震荡器LSI 易混淆点: RC(Resistor-Capacitor,电阻-电容振荡器)一般是内部时钟源 RTC(Real-Time Clock,实时时钟)…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
问了AI写的不错,记录一下,排查一些报错的时候比较好用 在 Linux 中,您可以通过命令行工具查看某个文件夹下的所有文件(限制到当前文件夹及其子文件夹两层深度),并搜索包含特定单词(如 XXXXX&am…...
Android 常见View的防抖
在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...
Unity打包到webgl鼠标图标大小不正确
我使用了自定义鼠标纹理,打包出来发现鼠标特别的大,位置也不对劲 研究了一下,不考虑浏览器界面缩放的话,可以直接改import settings的最大尺寸,改成合适的尺寸。 暂时先这样解决吧 最后贴一个设置鼠标图标的代码 pub…...
CentOS 7中安装Dify
Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...
爬蟲動態IP代理與數據採集穩定性
對於從事爬蟲開發的人來說,IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站,通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用,會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
解决Vscode项目同时运行两个项目终端无法自动叠加的问题
终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...
vuex中的state是响应式的吗?
在 Vue.js 中,Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时,依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的,该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...
k8s面试题总结(九)
1.K8s中pod删除失败,有哪些情况?如何解决? Pod删除失败的情况: (1) Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod 解决:先删除引用该pod的资源,再删除pod…...
【JQuery—前端快速入门】JQuery 操作元素
JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法: 这三个方法即可以获取元素的内容,又可以设置元素的内容. 有参数时,就进行元素的值设置,没有参数时,就进行元素内容的获取. 接下来,我们需…...
三维数据可视化与表面重建:Marching Cubes算法的原理与应用
1. 引言 随着现代医学影像技术的飞速发展,三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中,Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…...
网络变压器的主要电性参数与测试方法(2)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...
端到端自动驾驶——cnn网络搭建
论文参考:https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目,首先需要配置好我的仿真环境,下载软件udacity: https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...
# 【Unity】【游戏开发】赛车游戏中碰撞加速的实现方法
背景 在赛车类游戏开发中,常常需要实现赛车在碰撞某些道具或对象后加速的功能。例如,当赛车经过加速带或碰撞加速道具时,速度会瞬间增加,使游戏更具动态性和可玩性。本文将介绍一种通用的实现方式,并分析其逻辑。 分析 加速的核心逻辑如下: 判断碰撞条件:检测赛车是否…...
Dubbo本地服务调试
本地服务之间调试 参考这个文档: Dubbo本地调试 注意事项 本地主服务调用本地另外一个子服务,dubbo端口号与子服务的WEB端口号不一致。要查看子服务dubbo的配置文件,设置的rpc端口号是多少主服务中,最好在dubbo的配置文件&…...
SqlSugar 语法糖推荐方式
//方式1:var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2:不推荐使用,建议优先使用 Lambda 表达式,因为它更…...
爬虫逆向实战小记——解决captcha滑动验证码
注意!!!!某XX网站实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw 第一步: 分析请求网址和响应内容 (1)通过观察,滑…...
printf 与前置++、后置++、前置--、后置-- 的关系
# 前置和前置-- 先看一段代码 大家是不是认为printf输出的是 2 3 3 2 1 1 但是实际输出的是 3 3 3 1 1 1 在这两行printf函数代码里,编译器会先计算 a 和 --a 的值,然后再 从右向左 开始输出。 printf函数中,如果有多个…...
【Web前端开发】---HTML标签及标签属性
1、单标签与双标签 HTML标签分为:双标签、单标签。 例如: <marquee>你好</marquee> 示例: 双标签:<标签名>标签体</标签名> 单标签:<标签名/>(注意:/可以省…...
【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析
DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…...
【赵渝强老师】监控Redis
对运行状态的Redis实例进行监控是运维管理中非常重要的内容,包括:监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...
RocketMQ顺序消费机制
RocketMQ的顺序消费机制通过生产端和消费端的协同设计实现,其核心在于局部顺序性,即保证同一队列(MessageQueue)内的消息严格按发送顺序消费。以下是详细机制解析及关键源码实现: 一、顺序消费的核心机制 1. 生产端路…...
新装的conda 以及pycharm未能正确初始化,或conda环境变量配置错误问题解决!!!
Windows PowerShell 版权所有(C) Microsoft Corporation。保留所有权利。 安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows PS E:\Dev_project\MyProjects> conda cativate py12 usage: conda-script.py [-h…...
通往 AI 之路:Python 机器学习入门-线性代数
2.1 线性代数(机器学习的核心) 线性代数是机器学习的基础之一,许多核心算法都依赖矩阵运算。本章将介绍线性代数中的基本概念,包括标量、向量、矩阵、矩阵运算、特征值与特征向量,以及奇异值分解(SVD&…...
2025国家护网HVV高频面试题总结来了03(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...
内容中台与企业内容管理架构解析
内容中台技术架构解析 内容中台的技术架构以数据资产化和服务API化为核心,通过解耦内容生产与消费环节构建数字化基础设施。其架构通常包含统一内容池、智能处理引擎和开放接口层三大模块:统一内容池通过标准化元数据模型对多源异构内容进行结构化存储&…...
希音(Shein)前端开发面试题集锦和参考答案
用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…...
《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》
A telomere-to-telomere reference genome provides genetic insight into the pentacyclic triterpenoid biosynthesis in Chaenomeles speciosa Amplification of transposable elements 转座元件的扩增 Sequence mining disclosed that TEs were one main event in the ex…...
使用easyocr、PyPDF2对图像及PDF文档进行识别
一、概述 本 Python 脚本的主要功能是对当前目录及其子目录下的图片和 PDF 文件进行光学字符识别(OCR)处理。它使用 easyocr 库处理图片中的文字,使用 PyPDF2 库提取 PDF 文件中的文本,并将处理结果保存为文本文件。同时ÿ…...
用AI学安卓游戏开发1——控制小球上下左右移动2
业务逻辑:初始化小球随机自有移动,遇到屏幕边缘反弹,摇杆介入后小球停止自有移动,按照摇杆控制方向移动。 https://download.csdn.net/download/AnalogElectronic/90453667 https://download.csdn.net/download/AnalogElectronic…...
计算机毕业设计SpringBoot+Vue.js医院挂号就诊系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
说一下redis事务底层原理
Redis事务 1. 事务的基本流程 Redis 事务通过 MULTI、EXEC、WATCH 等命令实现,底层原理可以分为以下几个步骤: (1) MULTI 命令 当客户端发送 MULTI 命令时,Redis 会将客户端标记为“事务模式”。在事务模式下,客户端发送的所有…...
eNSP中AR2220、AR201、AR1220、AR2240、AR3260、Router、NE40E、NE5000E、NE9000、CX路由器学习笔记
eNSP中常见华为路由器型号的接口特性详解及横向对比,重点关注接口类型、扩展能力和适用场景: 缩写解释: LPU:Line Processing Unit(线路处理单元) SPU:Service Processing Unit(业务…...
FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)
文章目录 FastGPT 引申:借鉴 FastGPT 基于MySQL ES 实现知识库(含表结构以及核心代码)一、整体思路二、存储结构2.1 MySQL 表结构(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…...
WPF+WebView 基础
1、基于.NET8,通过NuGet添加Microsoft.Web.WebView2。 2、MainWindow.xaml代码如下。 <Window x:Class"Demo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/win…...
skia的学习与研究
最近再研究skia,特地发一篇文章来记录一下。Skia版本更新非常频繁,大概每四周就会创建一个新版本,此版本持续维护六周左右就会被标记为稳定分支; skia三套渲染: 无gpu硬件如嵌入式设备,使用CPU渲染,使用…...
Linux--基础命令3
大家好,今天我们继续学习Linux的基础命令 mv命令 mv命令是move的缩写,可以用来移动文件或者将文件改名 move(rename) files,经常⽤来备份⽂件或者目录 语法: mv [ 选项 ] 源⽂件或目录 目标⽂件或目录 mv src[文件、目录] dst[路径、文…...
[LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值
逆波兰式求表达值 题目链接 题目描述 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。 每个操作数(运…...
记一次误禁用USB导致键盘鼠标失灵的修复过程
背景说明 在电脑上插入了一个USB hub,然后弹窗提示:“集线器端口上出现电涌”,点开让选择“重置”或者“关闭”,不小心点了关闭,结果这个usb口就被关了,再插任何东西都没反应,找了很多办法都恢…...
node项目前后端密码加密传输及存储方案
前端:使用crypto-js库的SHA256算法,包含用户注册时使用的邮箱加上自定义的secret key生成盐值,接着使用PBKDF2算法进行加密。最后将加密后的密码传给后端。 import CryptoJS from "crypto-js";export const encryptPassword (ema…...
GIt分支合并
分支 1: C0 → C1 → C2 → C3(最新) 分支 2: C0 → C4 → C5 → C6(最新)1. 找到共同父节点 C0 Git 会先找出 branch1 和 branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成,虽然在日常使用 git merge…...
Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境
文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code(简称VSCode)以其强大的功能和灵活的扩展性,成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…...
linux一些使用技巧
linux一些使用技巧 文件名称和路径的提取切换用户执行当前脚本一行演示单引号与双引号的使用curl命令仅输出响应头信息,不输出body体文件名称和路径的提取 文件路径为 /tmp/tkgup/test.sh 方式获取文件名获取文件路径获取文件全路径方式一basename ${file}dirname ${file}real…...
GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)
目录 文章目录 目录1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现:OpenGL 3D 渲染管线设计1. 顶点处理ÿ…...
chrome Vue.js devtools 提示不支持该扩展组件,移除
可能是版本不兼容,可以重新安装,推荐网址极简插件官网_Chrome插件下载_Chrome浏览器应用商店 直接搜索vue,下载旧版,vue2、vue3都支持,上面那个最新版本试了下,vue2的肯定是不能用...
大模型工程师学习日记(十):基于 LangChain 构建向量存储和查询 Qdrant
Qdrant介绍 Qdrant(读作:quadrant /kwɑdrənt/ n. 象限;象限仪;四分之一圆)是一个向量相似度搜索引擎。它提供了一个生产就绪的服务,具有方便的 API 来存储、搜索和管理点 - 带有附加载荷的向量。Qdrant专…...