码农知识堂 - 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
  • 相关阅读:
    Python 生成器 (通俗讲解)
    requests处理 multipart/form-data 请求以及 boundary值问题
    条件渲染(vue)
    计算机视觉40例案例介绍
    能链科技深耕苏州,受邀参加中国金融科技产业峰会
    OpenAI 推出ChatGPT Edu,为高校定制版本
    2022年第二季度全球网络攻击创新高,如何有效防范网络攻击
    计算机毕业设计SSM电竞资讯网站【附源码数据库】
    海藻酸钠-聚乙二醇-四嗪 TZ-PEG-alginate 四嗪修饰海藻酸钠 海藻酸钠-PEG-四嗪
    流式数据处理与高吞吐消息传递:深入探索Kafka技术的奥秘
  • 原文地址:https://blog.csdn.net/weixin_38215395/article/details/134328677
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号