码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 分布式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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    使用说明

    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类型
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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;
    
    • 1
    • 2
    • 3
    • 4

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参与贡献

    项目地址: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
  • 相关阅读:
    使用C# 创建、填写、删除PDF表单域
    做大数据开发一定要知道几个重要的框架和工具及知识点
    Cloudflare Pages 搭建hexo
    设将n(n>1)个整数存放在一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(0<P<n)个位置
    2021 ICPC 澳门站G Cyclic Buffer (特殊的状压dp)
    大兴机场引入明道云,打造敏态应用开发平台
    BUUCTF:[MRCTF2020]套娃
    在没有硬盘的情况下进行电脑数据迁移
    新知实验室-基于腾讯云音视频TRTC的微信小程序实践
    Python 升级之路( Lv12 ) Pygame游戏开发基础
  • 原文地址:https://blog.csdn.net/weixin_38215395/article/details/134328677
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号