IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 从零开发短视频电商 轻量级方案利用MySQL实现递增的业务流水号 -> 正文阅读

[大数据]从零开发短视频电商 轻量级方案利用MySQL实现递增的业务流水号

背景

在短视频电商系统中,有很多需要产生递增的业务流水号的需求,例如:

  • 订单号:D202111190000001(D+yyyyMMdd+7位递增数字)
  • 用户ID:拼友0000000001(拼友+10位递增数字)

这里仅介绍成本较低的基于数据库的实现,也可以基于Redis等实现,我们这里不讨论。

方案

方案一 使用Max()函数(不推荐)

使用Mysql的Max() 函数获取字段最大的那条记录的相应值。

大致伪代码如下。

select max(no) from order;
no = max(no) + 1;
insert into order values (no);

存在并发问题,要用锁解决,不推荐使用哈。

方案二 自增序列 AUTO_INCREMENT(看情况)

MySQL 自增序列是一组整数:1, 2, 3, …

一张数据表只能有一个自增主键递增列必须使用索引

所以这里主键id不能设置自动递增,改为程序设置雪花ID或者UUID。

CREATE TABLE `order` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `no` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `no` (`no`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

可以使用AUTO_INCREMENT=1000设定自增起始点

这个方案成本极低,视情况选择吧,兄弟们。

方案三 自定义序列表(推荐)

https://blog.csdn.net/weixin_42383575/article/details/103023379

  • 1.创建序列表
CREATE TABLE `sequence` (
  `name` varchar(10) NOT NULL COMMENT '业务名称 例如订单:ORDER_NO,用户:USER_NO',
  `current_value` int(11) NOT NULL COMMENT '当前值,初始值',
  `increment` int(11) NOT NULL DEFAULT '1' COMMENT '步长',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 2.创建获取当前值的函数 currval()
DROP FUNCTION IF EXISTS currval; 
DELIMITER $ 
CREATE FUNCTION currval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
DECLARE value INTEGER; 
SET value = 0; 
SELECT current_value INTO value 
FROM sequence
WHERE name = seq_name; 
RETURN value; 
END
$ 
DELIMITER ;
  • 3.创建获取下一个值的函数nextval()
DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment 
WHERE name = seq_name; 
RETURN currval(seq_name); 
END
$ 
DELIMITER;
  • 4.初始化自增业务序列
# 插入订单业务,初始值0,步长1
INSERT INTO sequence VALUES ('ORDER_NO', 0, 1);
# 插入用户业务,初始值1000,步长1
INSERT INTO sequence VALUES ('USER_NO', 1000, 1);
  • 5.业务集成

伪代码如下:

no = SELECT NEXTVAL('ORDER_NO');
// 这里可以对no做业务处理哦,例如某些吉祥的号码保留,不吉祥的剔除。
insert into order values (no);

扩展

1.针对订单号D202111190000001(D+yyyyMMdd+7位递增数字)的处理。

可以在库里预生产每天的自增业务序列,例如:

INSERT INTO sequence VALUES ('ORDER_NO_20211119', 0, 1);
INSERT INTO sequence VALUES ('ORDER_NO_20211120', 0, 1);

业务使用示例如下:

no = SELECT NEXTVAL('ORDER_NO_20211119');
// 这里可以对no做业务处理哦,例如某些吉祥的号码保留,不吉祥的剔除。
insert into order values (no);

2.针对用户拼友0000000001的处理。

有很多骚需求,例如666、888、999等非常雕的号码留着。可以使用代码处理下吧。

no = SELECT NEXTVAL('ORDER_NO_20211119');
// 这里可以对no做业务处理哦,例如某些吉祥的号码保留,不吉祥的剔除。
insert into order values (no);

参考:

  • https://blog.csdn.net/weixin_42383575/article/details/103023379
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:27:52  更:2021-11-20 18:29:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:08:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码