id 生成器

id 生成器应用场景全局流水号区分前后台订单号参考电商订单号设计的资料数据库主键[单调]递增可能考虑分库分表

大家好,又见面了,我是你们的朋友全栈君。

应用场景

  1. 全局流水号
  1. 区分前后台
  2. 包含日期,可以从流水号一眼看出日期
  3. 不需要显示在前台,可以在后台显示
  4. 唯一标识每一次请求
  1. 订单号 , 优惠券号码等电商业务相关

参考电商订单号设计的资料,自定义实现

  1. 数据库主键
  1. [单调]递增
  2. 可能考虑分库分表
  3. 使用 美团leaf

全局流水号

构成: 1/2/3-时间格式化-序号
1: auth
2: admin
3: api
例:

2-2020-10-28-22:58:58-3

代码参考

https://gitee.com/sanren2016/shop-boot/tree/847b1c1d9037d8156d91c588561806c39edee63e/

效果

在这里插入图片描述

实现思路

使用全局拦截器+ThreadLocal,在preHandle中获取流水号,流水号获取代码:
com.laolang.shop.common.data.mvc.trace.TraceComponent

美团 Leaf

参考: https://github.com/Meituan-Dianping/Leaf/blob/master/README_CN.md

git clone git@github.com:Meituan-Dianping/Leaf.git
git checkout feature/spring-boot-starter
cd leaf
mvn clean install -Dmaven.test.skip=true 

引入时需要注意mybatis依赖和druid依赖的冲突

<dependency>
    <artifactId>leaf-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>druid</artifactId>
            <groupId>com.alibaba</groupId>
        </exclusion>
        <exclusion>
            <artifactId>mybatis</artifactId>
            <groupId>org.mybatis</groupId>
        </exclusion>
    </exclusions>
    <groupId>com.sankuai.inf.leaf</groupId>
    <version>1.0.1-RELEASE</version>
</dependency>

配置文件: leaf.properties

leaf.name=shop-boot-leaf
leaf.segment.enable=true
leaf.segment.url=jdbc:mysql://192.168.1.110:3306/shop_boot?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true
leaf.segment.username=shopboot
leaf.segment.password=shopboot

leaf.snowflake.enable=false
#leaf.snowflake.address=
#leaf.snowflake.port=

建表语句

CREATE TABLE `leaf_alloc` (
  `biz_tag` varchar(128)  NOT NULL DEFAULT '',
  `max_id` bigint(20) NOT NULL DEFAULT '1',
  `step` int(11) NOT NULL,
  `description` varchar(256)  DEFAULT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;

insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-segment-test', 1, 2000, 'Test leaf Segment Mode Get Id')

测试

package com.laolang.shop;

import com.sankuai.inf.leaf.service.SegmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;

public class ComponentTest extends BaseComponentTest { 
   

    @Autowired
    private SegmentService segmentService;

    @Test
    public void componentTest() { 
   
        System.out.println(segmentService.getId("leaf-segment-test"));
        System.out.println(segmentService.getId("leaf-segment-test"));
        System.out.println(segmentService.getId("leaf-segment-test"));
        System.out.println(segmentService.getId("leaf-segment-test"));
        System.out.println(segmentService.getId("leaf-segment-test"));
    }
}

输出

Result{id=1, status=SUCCESS}
Result{id=2, status=SUCCESS}
Result{id=3, status=SUCCESS}
Result{id=4, status=SUCCESS}
Result{id=5, status=SUCCESS}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148788.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • php 数组根据值找key,从数组查找key对应的值 – key

    php 数组根据值找key,从数组查找key对应的值 – key…L,`nick`varchar(32)DEFAULTNULL,`reg_date`datetimeDEFAULTNULL,PRIMARYKEY(`id`),KEY`IND_NICK`(`nick`),KEY`IND_REGDATE`(`reg_date`))CREATETABLE`users`(`id`int(11)NOTNULL,`nick`varchar(32)D…

  • 内存调试MEMWATCH

    内存调试MEMWATCH
    内存调试-MEMWATCH
     
    MEMWATCH由JohanLindh编写,是一个开放源代码C语言内存错误检测工具,您可以自己下载它(请参阅本文后面部分的参考资料)。只要在代码中添加一个头文件并在gcc语句中定义了MEMWATCH之后,您就可以跟踪程序中的内存泄漏和错误了。MEMWATCH支持ANSIC,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneousfree)、没有释放的内存(unfreedmemo

  • Sublime Text 2 介紹

    Sublime Text 2 介紹

  • python编写怎么换行_python表示换行

    广告关闭腾讯云11.11云上盛惠,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!windows换行符是’rn’,unixlinux的换行符为’n’,mac的换行符为’r’,在python中,对换行符进行了统一处理,定义为’n。到此这篇关于python代码中怎么换行的文章就介绍到这了,更多相关python写代码怎么换行内容请搜索zalou.cn以前的文章或继续浏…

  • ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口

    ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?1.1描述SFTP(SSHFileTransferProtocol)即安全文件传送协议),是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。sftp是基于ssh上实现的,所以严格来说我们是无法来关闭ssh,而只是使用sftp。ssh…

  • SSIS技巧–优化数据流缓存

    SSIS技巧–优化数据流缓存

    2021年11月26日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号