分布式ID选型对比(1)
常见的几种ID生成方式对比:
| 种类 | 全局唯一 | 高性能 | 高可用 | 趋势递增 | 中心服务 | 缺点 |
| UUID | 是 | 高(本地生成,(无网络开销) | 低(无序,不适用) | 否 | 否 | 无序、字符串 |
| 数据库自增 | 单表唯一 | 中 | 中(宕机就会使业务服务中断) | 是 | 否 | 安全性差,能猜出来规律 对于分库分表场景无法唯一 |
| 数据库自增-集群 | 是 | 中 | 中(宕机就会使业务服务中断) | 是 | 否 | 通过设置初始值及步长进行自增 不好扩展,增加节点可能导致不唯一 |
| 数据库号段模式 | 是 | 低(需要频繁更新表maxId) | 中(宕机就会使业务服务中断) | 是 | 否 | 依赖数据库,需要频繁更新数据库maxId 乐观锁方式保证高可用 |
| 数据库号段模式+缓存 | 是 | 中 | 中 | 是 | 否 | 在号段模式基础上增加缓存buffer 缓存数据同步到数据库需要保证强一致性,增加了复杂度 |
| redis的incr | 单模块唯一 多模块不适用 | 中 | 中(宕机就会使业务服务中断) | 是 | 否 | 多服务情况下单台redis无法满足 多redis集群时,主master宕机,会在较短时间内存在ID重复 |
| 雪花算法 | 高(不考虑回拨情况下) | 高(本地生成,(无网络开销) | 中(趋势递增) | 是 | 否 | 存在时钟回拨问题 多节点时可能需要自定义datacenterId和machineId的生成(IP) |
| 百度uid generator | 高 | 高(本地生成,(无网络开销) | 高(趋势递增) | 是 | 否 | 在雪花算法基础上增加启动服务时获取workId(或初始化workId) 项目启动时间会被拉长,依赖数据库 |
| 美团Leaf | 高 | 高(本地生成,(无网络开销,需要自己实现) 中(中心服务) | 高(自定义方式较复杂) | 是 | 是 | 百度uid模式下衍生而来 可以实现自己的ID生成中心,即leaf-server,由该项目提供获取ID的方法供调用,但该方式比较耗IO,性能会有所下降 依赖数据库或zookeper 为了提升性能,需要自己在项目里面自定义实现Leaf server |
| 滴滴TynyId | 高 | 高(本地生成,(无网络开销,需要自己实现) 中(中心服务) | 高(自定义方式较复杂) | 是 | 是 | 美团Leaf模式下衍生而来 可以实现自己的ID生成中心,即TynyId-server,由该项目提供获取ID的方法供调用,但该方式比较耗IO,性能会有所下降 依赖数据库或zookeper 为了提升性能,需要自己在项目里面自定义实现TynyId server |
----------------------------------------------------------------------------------------------
数据库自增
一, 引入依赖:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency>
二, 新建表
CREATE TABLE `auto_generate` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
三, resources目录下编写自动生成代码配置文件: generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!--mysql 连接数据库jar 这里选择自己本地位置;如果不知道maven本地仓库地址,可以使用EveryThing工具全局搜索mysql-connector-java,找到jar包位置;也可以手动下载一个jar放在指定位置,进行引用。--><classPathEntry location="/Users/lizhihao/.m2/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar"/><context id="testTables" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自动生成的注释,true:是,false:否 --><property name="suppressAllComments" value="true"/></commentGenerator><!--数据库连接的信息:驱动类、连接地址、用户名、密码 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/generate_id" userId="root"password="root"></jdbcConnection><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和NUMERIC 类型解析为java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- 指定javaBean生成的位置targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录--><javaModelGenerator targetPackage="org.com.spi.model" targetProject="src/main/java"><!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,相关文章:
分布式ID选型对比(1)
常见的几种ID生成方式对比: 种类 全局唯一 高性能 高可用 趋势递增 中心服务 缺点 UUID 是 高(本地生成,(无网络开销) 低(无序,不适用) 否 否 无序、字符串 数据库自增 单表唯一 中 中(宕机就会使业务服务中断) 是 否 安全性差,能猜出来规律 对于分库分表场景无法唯一 数据库自…...
T-SQL 高阶语法之存储过程
一:存储过程概念 预先存储好的sql程序,通过名称和参数进行执行,供应程序去调用,也可以有返回结果,存储过程可以包含sql语句 可以包含流程控制、逻辑语句等。 二:存储过程的优点 执行速度更快 允许模块化…...
解决鸿蒙模拟器卡顿的问题
缘起 最近在学习鸿蒙的时候,发现模拟器非常卡,不要说体验到鸿蒙的丝滑,甚至到严重影响使用的程度。 根据我开发Android的经验和在论坛翻了一圈,最终总结出了以下几个方案。 创建模拟器 1、在DevEco Virtual Device Configurat…...
【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点
BFS的基本概念 BFS 是广度优先搜索(Breadth-First Search)的缩写,是一种图遍历算法。它从给定的起始节点开始,逐层遍历图中的节点,直到遍历到目标节点或者遍历完所有可达节点。 BFS 算法的核心思想是先访问当前节点的…...
设计模式-结构模式-装饰模式
装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。 //首先,定义一个组件接口: public in…...
MySQL:一行记录如何
1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成,InnoDB存储引擎的逻辑存储结构大致如下图: 行 数据库表中的记录都是按「行」进行存放的,每行记录根据不同的行格式,有不同的存储结构。 页…...
‘grafana.ini‘ is read only ‘defaults.ini‘ is read only
docker安装grafana 关闭匿名登录情况下的免密登录遇到问题 grafana.ini is read only defaults.ini is read only 参考回答(Grafana.ini giving me the creeps - #2 by bartweemaels - Configuration - Grafana Labs Community Forums) 正确启动脚本 …...
博途PLC 面向对象系列之“输送带控制功能块“(SCL代码)
这篇是面向对象系列之"输送带功能块"的封装,面向对象是系列文章,相关链接如下: 1、面向对象系列之找"对象" https://rxxw-control.blog.csdn.net/article/details/136150027https://rxxw-control.blog.csdn.net/article/details/1361500272、面向对象…...
2024-02学习笔记
1.当我们向Set集合中添加一个已经存在的元素时 当我们向Set集合中添加一个已经存在的元素时,Set集合会如何处理呢?实际上,Set集合不会将重复的元素添加到集合中。当我们向Set集合中添加一个元素时,Set集合会首先判断该元素是否已…...
最新消息:英特尔宣布成立全新独立运营的FPGA公司——Altera
今天,英特尔宣布成立全新独立运营的FPGA公司——Altera(2015年6月Intel以 167 亿美元的价格,收购FPGA厂商Altera)。首席执行官Sandra Rivera和首席运营官Shannon Poulin分享展示其在超过550亿美元的市场中保持领先性的战略规划&am…...
RC正弦波振荡电路
RC正弦波振荡电路 RC正弦波振荡电路又称文氏电桥振荡电路,可以设计频率为f1/2πRC的正弦波发生器。 RC正弦波振荡电路设计:50Hz,振幅为3.47V 电路分析: 1.起振条件取决于R1, R4,R2与1N4148并联电阻(下面简称Rf&#…...
【Git学习笔记】提交PR
step1 克隆一个仓库 git clone .....step2 创建一个分支 (Creating a branch) # 创建并切换到本地新分支,分支的命名尽量简洁,并与解决的问题相关 git checkout -b delete-unused-linkstep3 做出修改 (Make changes) step4 提交修改 # 保存本地修…...
线程池的相关参数
在Java中线程池是一种池化技术,用于管理和复用线程,提高线程的利用率和性能。下面是一些常见的线程池的参数及其解释: 一:线程池的七大参数 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTim…...
图书推荐||Word文稿之美
让你的文档从平凡到出众! 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧,再到快速修正错误和保护文件,全面系统地讲解数字排版的技术和能力&…...
前端导出word文件的多种方式、前端导出excel文件
文章目录 纯前借助word模板端导出word文件 (推荐)使用模板导出 前端通过模板字符串导出word文件前端导出 excel文件,node-xlsx导出文件,行列合并 纯前借助word模板端导出word文件 (推荐) 先看效果…...
Linux和Windows操作系统在腾讯云幻兽帕鲁服务器上的内存占用情况如何?
Linux和Windows操作系统在腾讯云幻兽帕鲁服务器上的内存占用情况如何? 对于Linux操作系统,有用户分享了个人最佳实践来解决内存问题,包括使用Linux脚本让服务器每天重启一次,以及建议在不需要时尽量减少虚拟内存的使用。此外&…...
腾讯云4核8G的云服务器性能水平?使用场景说明
腾讯云4核8G服务器适合做什么?搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以,腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM,轻量服务器和标准型CVM服务器性能是差不多的,轻…...
1_SQL
文章目录 前端复习SQL数据库的分类关系型数据库非关系型数据库(NoSQL) 数据库的构成软件架构MySQL内部数据组织方式 SQL语言登录数据库数据库操作查看库创建库删除库修改库 数据库中表的操作选择数据库创建表删除表查看表修改表 数据库中数据的操作添加数…...
PoC免写攻略
在网络安全领域,PoC(Proof of Concept)起着重要的作用,并且在安全研究、漏洞发现和漏洞利用等方面具有重要的地位。攻击方视角下,常常需要围绕 PoC 做的大量的工作。常常需要从手动测试开始编写 PoC,再到实…...
c1-周考2
c1-第二周 9月-技能1.一个岛上有两种神奇动物,其中神奇鸟类2个头3只脚,神奇兽类3个头8只脚。游客在浓雾中看到一群动物,共看到35个头和110只脚,求可能的鸟类和兽类的只数2.构建一个长度为5的数组,并且实现下列要求3.构…...
C 语言数据类型全解析:从基础到实战
数据类型是 C 语言的基石,也是每个 C 语言初学者必须掌握的核心概念。它决定了变量在内存中占用的空间大小、存储方式以及取值范围。本文将从最基础的概念讲起,系统梳理 C 语言所有数据类型,包含详细的语法、示例代码和实战技巧,帮…...
将 fnOS 从 eMMC/TF 卡无损迁移至外部存储(NVMe/USB/SATA/TF)的完整方案 —— 适用于瑞芯微 RK 系列平台(含小容量盘适配)
将 fnOS 从 eMMC 无损迁移至 NVMe SSD 日常用 ARM 设备,总习惯把固件刷进 eMMC 或者 TF 卡。eMMC 读写慢,寿命有限,用久了总觉得差口气。我手头有块 NanoPC-T4,给它刷了 Arm 飞牛固件简单体验了一下,就琢磨:…...
OpCore Simplify:如何用图形化工具快速完成黑苹果EFI配置?
OpCore Simplify:如何用图形化工具快速完成黑苹果EFI配置? 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCo…...
STM32 HardFault_Handler:从寄存器解码到源码定位的实战指南
1. 初识HardFault:当你的STM32突然"罢工" 第一次遇到STM32程序跑飞进入HardFault_Handler时,那种感觉就像开车时突然抛锚——仪表盘亮起故障灯,但你完全不知道引擎舱里发生了什么。作为嵌入式开发者,HardFault是我们最常…...
2026年“Highcharts vs ECharts”|企业可视化选错图表库,不止是多花成倍成本
在做企业数据可视化时,很多开发者第一反应是:用免费的 ECharts或者用 企业级Highcharts商业版图表库但问题是:这不是“哪个好用”的问题,而是“你未来成本会差多少”的问题。一、一个被低估的决策图表库选择,看起来只是…...
从掩码配置到数据拼接:手把手教你用C2000 DSP的CAN实现IAP固件升级
从掩码配置到数据拼接:手把手教你用C2000 DSP的CAN实现IAP固件升级 在工业控制和汽车电子领域,固件升级的可靠性直接关系到设备长期运行的稳定性。传统方式需要拆机烧录,而基于CAN总线的IAP(In Application Programming)技术让远程更新成为可…...
Ubuntu 24.04 镜像源优化配置指南
1. 为什么需要优化Ubuntu镜像源 刚装完Ubuntu 24.04系统时,很多朋友都会遇到软件包下载速度慢的问题。这就像网购时默认的快递公司可能离你家很远,而换个近的仓库就能当天收货。Ubuntu官方服务器在国外,国内用户直接连接就像跨洋收快递&#…...
MeteorSeed潮
这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts impo…...
数据摄取构建模块简介(预览版)(二)趴
Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...
深度学习实战:用多尺度训练提升图像识别准确率(附TensorFlow代码)
深度学习实战:用多尺度训练提升图像识别准确率(附TensorFlow代码) 当你在街头用手机拍摄远处模糊的路牌时,是否好奇过AI如何识别不同尺寸的物体?这正是多尺度训练技术要解决的核心问题。在医疗影像分析中,从…...
