分布式id生成数据库号段算法的golang实现

分布式id生成数据库号段算法的golang实现

    • 介绍
    • 项目结构
    • 使用说明
    • 核心流程说明
      • 1. 定义id生成器结构体
      • 2. id生成器共有Monitor,GetOne, Close三个对外暴露的方法。
      • 3. 数据表结构
    • 参与贡献

介绍

项目地址:gitee;github
本项目主要利用go语言(go1.20)实现了一种id生成器,并提供了http和grpc两种访问方式。项目中采用的生成算法主要基于数据库号段算法实现。关于这个算法可以参考
美团Left。

项目结构

main.go    - 程序入口,项目初始化,并实现了平滑停服
router     - 路由
controller - api接口
model      - 数据模型定义
dao        - 数据表操作
logic      - 逻辑操作grpcserver - grpc服务器idsequence - 实现了数据号段生成算法
conf        - 数据库配置信息
common      - 公共库config  - viper配置dto     - 请求响应/返回值结构体merrors - 错误码、错误信息定义mysql   - 数据库连接池xgrpc   - grpc server的proto定义

使用说明

  1. 项目采用go1.20编写,采用go mod进行包管理
  2. 编译运行 go build && ./go-tinyid
  3. 项目提供http和grpc两种访问方式,可自行选择

核心流程说明

1. 定义id生成器结构体

   type IdSequence struct {idListLength int64           // 号段长度,可根据业务qps自行设置biz          string          // 业务类型ids          chan int64      // 生成的id list, chan通道stopMonitor  chan bool       // 停止标志channel类型}

2. id生成器共有Monitor,GetOne, Close三个对外暴露的方法。

   Monitor方法主要实现对id list的监控,当检测到id list为空时,会调用add方法,向id list中添加idListLength个新id,在添加新id过程中,
会使用mysql 乐观锁,以防止其他进程也在更新获取到的最新id;GetOne方法主要会从id list里面获取一个新的id;Close方法主要是关闭channel,停止写入新的id;

3. 数据表结构

create table if not exists test.sequence
(id          bigint unsigned auto_increment primary key,biz         varchar(128) default ''                not null comment '业务类型',value       bigint       default 0                 not null comment 'id值',version     bigint       default 0                 not null comment '乐观锁',is_del      tinyint      default 0                 not null comment '是否软删标志',create_time timestamp    default CURRENT_TIMESTAMP not null comment '创建时间',update_time timestamp    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,unique (version)
) charset = utf8mb4;

参与贡献

项目地址:https://gitee.com/git-lz/go-tinyid;https://github.com/007LiZhen/go-tinyid

欢迎大家积极提issue和MR, 共建golang版本的tinyid

  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决mac 下 docker-compose 不是命令

docker-compose docker: ‘compose’ is not a docker command #6569 解决方法: mkdir -p /usr/local/lib/docker ln -s /Applications/Docker.app/Contents/Resources/cli-plugins /usr/local/lib/docker/cli-plugins参考: https://github.com/docker/…

Qt中对Udp数据打包发送和接收

有些小伙伴对怎么对Udp的数据打包不太清楚。下面我举例说明。 比如我们要发送一个Person的数据。可以先用一个结构把Person的数据封装。 struct Person {QString name;int age; };下面是udp客户端和服务器端完整的代码例子。 #ifndef UDPCLIENT_H #define UDPCLIENT_H#includ…

【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024) 2024 5th International Conference on Advanced Material and Clean Energy 第五届新材料与清洁能源国际学术会议(ICAMCE 2024)将于2024年2月23-25日在中国▪长沙…

lenovo联想小新 Air-14 2019 AMD平台API版(81NJ)原装出厂Windows10系统

下载链接:https://pan.baidu.com/s/1HCC66EH4UOcgofRx5_v1oA?pwdlgqw 提取码:lgqw 原厂系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式&#xf…

KafkaConsumer 消费逻辑

版本:kafka-clients-2.0.1.jar 之前想写个插件修改 kafkaConsumer 消费者的逻辑,根据 header 过滤一些消息。于是需要了解一下 kafkaConsumer 具体是如何拉取消费消息的,确认在消费之前过滤掉消息是否会有影响。 下面是相关的源码&#xff0…

GZ038 物联网应用开发赛题第1套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第1套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员…

【漏洞复现】BYTEVALUE智能流控路由器存在命令执行

【漏洞介绍】 百为智能流控路由器 /goform/webRead/open 路由的 ?path 参数存在有回显的命令注入漏洞。攻击者可通过该漏洞在服务器端执行命令,写入后门,获取服务器权限,从而获取路由器权限。 【指纹】 title”BYTEVALUE 智能流控路由器”…

151. 反转字符串中的单词

151. 反转字符串中的单词 原题链接:完成情况:解题思路:参考代码:错误经验吸取 原题链接: 151. 反转字符串中的单词 https://leetcode.cn/problems/reverse-words-in-a-string/description/ 完成情况: 解…

ai批量剪辑矩阵无人直播一站式托管系统源头技术开发

1.全店IP形象打造----剪辑 全店IP打造模式为场景组合,需要在每个场景内按照顺序分别上传短视频素材,会与选中的音乐、标题文案组合生成有逻辑顺序的视频。可调配标题字号大小、音频音量大小。如想要携带团购地址可设置POI。可开启团购引导动画、镜头转场…

AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀

文章目录 一、ChatGPT简介二、ChatGPT在产品经理工作中的应用1. 快速获取用户反馈2. 智能分析竞品3. 智能推荐产品4.分析市场趋势5.优化产品功能 三、总结与展望《AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀》亮点内容简介目录作者简介获取方式 随着人工智能…

梯度@等值线@梯度运算法则

文章目录 梯度点处梯度函数梯度梯度和方向导数的关系 等值线等值线法线和梯度三元函数梯度点处梯度函数梯度梯度长度等值面 梯度运算法则 梯度 梯度是一个与方向导数相关的概念,梯度本质上是向量,是由各个自变量的偏导数定义的向量;梯度通常充当方向导数(函数变化率)的最值的角…

火山引擎公共云·城市分享会:共享云经验,一起向未来

数智化时代的来临,不仅激发了行业对云计算的资源需求,也重构了云计算的技术架构及产品布局,给业务场景带来更多可能性,让云计算成为企业走向高效治理的一剂“良方”。随着业务的多样化、复杂化,企业应该如何借助云计算…

各种业务场景调用API代理的API接口教程(附带电商平台api接口商品详情数据接入示例)

API代理的API接口在各种业务场景中具有广泛的应用,本文将介绍哪些业务场景可以使用API代理的API接口,并提供详细的调用教程和代码演示,同时,我们还将讨论在不同场景下使用API代理的API接口所带来的好处。 哪些业务场景可以使用API…

NAS 扩容简明指南:使用各种外设给 NAS 们扩容

说起来有趣,NAS 除了“不同设备共享存储”这个功能之外,最重要的功能就是为设备扩容,但是 NAS 自己的存储容量不够了,又该如何。 ​这篇文章分享下我目前使用外设给 NAS 扩容的思路,如何以相对低的成本来获取更大的容…

【python】乘机最大

题目: """ 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K1个部分,找出一种分法,使得这K1个部分的乘积能够为最大。为了帮助选手能够正确理解题意,主持人还举了如下的一个例子有一个数字串: 31…

竞赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 🔥 优质竞赛项目系列,今天要分享的是 行人车辆目标检测计数系统 …

【系统救援】 Ubuntu重启失败,报错:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY

问题定位及处理 查看错误信息:/dev/sda3 contains a file system with errors, check forced. /dev/sda3: Inodes that were part of a corrupted orphan linked list found. /dev/sda3: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY. (i.e., without -a or -p o…

【数据结构】堆详解!(图解+源码)

🎥 屿小夏 : 个人主页 🔥个人专栏 : 数据结构解析 🌄 莫道桑榆晚,为霞尚满天! 文章目录 🌤️前言🌤️堆的理论☁️二叉树的顺序存储☁️堆的概念 🌤️堆的实现…

路径加密(替换空格),剑指offer,力扣

目录 我们直接看题解吧: 方法: 审题目事例提示: 解题思路: 法1: 代码(法1): 法2: 代码(法2): 原题解: 【剑指Offer】2、替…

GoLong的学习之路(二十三)进阶,语法之并发(go最重要的特点)(锁,sync包,原子操作)

这章是我并发系列中最后的一章。这章主要讲的是锁。但是也会讲上一章channl遗留下的一些没有讲到的内容。select关键字的用法,以及错误的一些channl用法。废话不多说。。。 文章目录 select多路复用通道错误示例并发安全和锁问题描述互斥锁读写互斥锁 syncsync.Wait…