分布式:可任意横向扩展
高性能:分配 ID 只访问内存(到达上限会请求数据库一次)
易用性:对外提供 HTTP 服务
唯一性:MySQL 自增 ID,永不重复
高可靠:MySQL 持久化
本项目使用下列优秀的项目作为必要组件。
gopkg.in/yaml.v2
github.com/go-sql-driver/mysql
github.com/satori/go.uuid
注意:需要在启动之前创建数据库并修改配置文件中数据库的配置。
go get 方式:
需保证 $GOPATH/bin 在系统 PATH 中。
go get github.com/qichengzx/seqsvr seqsvr
单独编译:
git clone git@github.com:qichengzx/seqsvr.git cd seqsvr go build . ./seqsvr
Docker 方式:
Dockerfile 使用了 Docker 多阶段构建功能,需保证 Docker 版本在 17.05 及以上。详见:Use multi-stage builds
git clone git@github.com:qichengzx/seqsvr.git cd seqsvr docker build seqsvr:latest . docker run -p 8000:8000 seqsvr:latest
数据库名称可以自定义,修改 config.yml 即可。
然后导入以下 SQL 生成数据表。
CREATE TABLE `generator_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uuid` char(36) NOT NULL COMMENT '机器识别码', PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`), UNIQUE KEY `stub_UNIQUE` (`uuid`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
配置文件使用 YAML 格式。
#app port: ':8000' #service step: 100 #db mysql: user: 'root' password: '' host: 'tcp(localhost:3306)' database: 'sequence'
可修改端口号及 MySQL 的配置。
curl http://localhost:8000/new{"code":0,"msg":"ok","data":{"id":101}}
本项目设计原理来自 携程技术中心 的干货 | 分布式架构系统生成全局唯一序列号的一个思路。
服务初始化后第一次请求会在 MySQL 数据库中插入一条数据,以生成初始 ID。
后续的请求,都会在内存中进行自增返回,并且保证返回的 ID 不会超过设置的上限,到达上限后会再次从 MySQL 中更新数据,返回新的初始 ID 。
核心SQL
REPLACE INTO `generator_table` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");
SEQSVR Go + MySQL 实现的高性能 ID 生成服务 特性 分布式:可任意横向扩展 高性能:分配 ID 只访问内存(到达上限会请求数据库一次) 易用性:对外提供 HTTP 服务 唯一性:MySQL 自增 ID,永不重复 高可靠:MySQL 持久化 依赖项 本项目使用下列优秀的项目作为必要组件。 gopkg.in/yaml.v2 github.com/go-sql-driver/mysq
我有表,当我添加新行时,我想计算一个id号。 条件: 如果我有缺失的数字,请给出最小的一个(3),如果我没有缺失的数字,请给出一行中的下一个数字(5) 如何将此条件构建到查询中? 我的查询: 桌子 如果我缺少id,则解决方案 如果我没有丢失的id,则解决方案
问题内容: 我正在使用PHP和MySQL编写脚本,并且想要获得一个唯一的ID(由字符串组成:大写字母和带数字的小写字母),例如:。我在PHP中发现了许多可以生成此类数字的函数,但我担心如何确保id唯一! 更新 :uuid很长,我的意思是这样的ID:(P5Dc)一个11个字母数字的字符。 问题答案: 一个 编程的方式 可以是: 在字段中添加一个唯一索引 在PHP中生成随机字符串 在PHP中循环(wh
问题内容: 有人知道如何从1开始生成,以便下一个对象具有2,依此类推吗? 我尝试了以下方法,但不起作用: 问题答案: 您需要一个 静态的 类成员来跟踪上次使用的索引。确保还实现一个复制构造函数: 更新: 正如@JordanWhite建议的那样,您可能希望使static计数器成为 atomic ,这意味着可以安全地同时使用(即一次在多个线程中使用)。为此,将类型更改为: 增量读取和复位操作变为:
问题 你想随机生成一个唯一的标识符。 解决方案 可以根据一个随机数值生成一个 Base 36 编码的字符串。 uniqueId = (length=8) -> id = "" id += Math.random().toString(36).substr(2) while id.length < length id.substr 0, length uniqueId() # =
带注释的类中的followig代码可用于两个数据库的自动键生成,但如果主键是自设置的,则会失败。 如果没有@GeneratedValue和@SequenceGenerator注释,则可以手动设置主键,但自动生成无法工作。
问题内容: 我尝试通过使用实体框架连接MySql数据库,但Visual Studio不想生成* .edmx? 我在db中有1个表, -选择ado.net edm,- 选择从数据库生成 -选择 db-在这里我认为我应该选择表,但是 向导关闭 我尝试使用其他版本的EF,但是仍然无法正常工作。问题是什么? 我的软件: -Windows 7 * 64 -vs 2017社区 -mySql 8.0社区 问题答
环境:Spring Boot 2.2.6 启动程序:spring-boot-starter-data-jpa,*-thymeleaf,*-web,*-Tomcat,*-test 其他依赖项:mariadb-java-client 2.6.0,spring-boot-devtools(管理),lombok(管理) DB mariadb:10.4 Hibernate方言:mariadb103 使用内部
我有一个包含4个项目的解决方案:Console netcoreapp3。1,标准类库2.1,辅助服务netcoreapp3。1、netcoreapp3下的xunit测试项目。1. 我做到了: sourceanalyzer-b*-清洁 sourceanalyzer-b X.sln msbuild“C:\X\X.sln”/nologo/v:n/t:Rebuild sourceanalyzer-显示生成