java,mysql触发器,redis生成流水号(yyyyMM000)
最近又遇到需要根据日期生成流水号的业务,然后记录了几种生成方法,一个是通过java代码,一个是数据库的触发器,还有是通过redis。下面是代码:
通过java生成简易流水:
/**
* 通过日期和生成的流水号拼接
* @param maxCount 已经生成的个数
* @return
*/
public static String recountNew(int maxCount) {
if (maxCount < 0) {
return null;
}
//201707999
String str = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
String countStr = str + num(maxCount, 3, 3);
System.out.println("合同编号: " + Long.valueOf(countStr));
return countStr;
}
/**
* 生成流水号
* @param current 当前生成个数
* @param max 最大整数位
* @param min 最小整数位
* @return 生成的流水号
*/
public static String num(int current, int max, int min) {
current++;
NumberFormat numberFormat = NumberFormat.getInstance();
//设置是否使用分组
numberFormat.setGroupingUsed(false);
//设置最大整数位数
numberFormat.setMaximumIntegerDigits(max);
//设置最小整数位数
numberFormat.setMinimumIntegerDigits(min);
return numberFormat.format(current);
}
通过数据触发器实现:
主要逻辑:以201906001 为例,根据当前日期 201606 获取流水号最大的一个,保存到n。然后把流水号加1,再和当前日期201906拼接到一起
CREATE TABLE orders (
orders_id INT (10) PRIMARY KEY,
customer_name VARCHAR (100)
);
DROP TRIGGER tr_orders_id;
CREATE TRIGGER tr_orders_id BEFORE INSERT ON orders FOR EACH ROW
BEGIN
DECLARE
n INT;
SELECT
IFNULL(max(RIGHT(orders_id, 3)), 0) INTO n
FROM
orders
WHERE
mid(orders_id, 1, 6) = DATE_FORMAT(now(), '%Y%m');
SET NEW.orders_id = concat(
DATE_FORMAT(now(), '%Y%m'),
RIGHT (001 + n, 3)
);
END;
INSERT INTO orders VALUES (0, 'jack');
INSERT INTO orders VALUES (0, 'jack');
redis实现(采用)
主要利用 StringRedisTemplate 来操作redis,写在业务层,需要使用直接注入就行。这是没有详细的说明配置StringRedisTemplate,下面代码会有问题,只是知道有这个方法,有用的时候,自己去写一下就好了。
/**
* @version V1.0
* @Authoer CX
* @Since:2019/5/20
*/
public interface NumberGenService {
/**
* 根据code生成编号
* 例:NB000001
* @param code 前缀
* @return 编号
*/
String generateNumber(String code);
/**
* 根据code及年月生成编号
* 例子:NB201905000001
* @param code 前缀
* @return 编号
*/
String generateNumberByMonth(String code);
/**
* 根据code及年月生成编号
* 例子:NB20190508000001
* @param code 前缀
* @return 编号
*/
String generateNumberByDay (String code);
}
import com.cloudkeeper.confinement.main.service.NumberGenService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @version V1.0
* @Authoer CX
* @Since:2019/5/20
*/
@Service
public class NumberGenServiceImpl implements NumberGenService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final int LENGTH = 6;
private static final String MONTH_FORMAT = "yyyyMM";
private static final String DAY_FORMAT = "yyyyMMdd";
public String generateNumber (String code) {
return getNumber(code, "");
}
public String generateNumberByMonth (String code) {
return getNumber(code, new SimpleDateFormat(MONTH_FORMAT).format(new Date()));
}
public String generateNumberByDay (String code) {
return getNumber(code, new SimpleDateFormat(DAY_FORMAT).format(new Date()));
}
private String getNumber(String code, String month) {
code += month;
Long number = stringRedisTemplate.opsForValue().increment("" + ":" + code);
return code + StringUtils.leftPad(number.toString(), LENGTH, '0');
}
}
总结
以上是总结的几种实现方式,公司采用的是通过redis的自增来实现的,可以避免并发时生成相同编号的问题。通过java生成,在保存时会出现相同编号的问题。
java,mysql触发器,redis生成流水号(yyyyMM000)的更多相关文章
- 云服务器配置 docker java mysql mongodb redis nginx 环境
磁盘挂载 fdisk -l #查看磁盘列表 mkfs.ext4 /dev/vdb #格式化磁盘 mount /dev/vdb /data #挂载磁盘在/data echo '/dev/vdb /dat ...
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来 ...
- redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)
一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...
- java中生成流水号的一个例子(使用关系型数据库)
在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水 ...
- Java工程师学习指南第7部分:重新学习MySQL与Redis
本文整理了微信公众号[Java技术江湖]发表和转载过的Mysql和Redis相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧. 大白话说说mysql 面试官:给我说说你平时是如何优化M ...
- 从零搭建java后台管理系统(二)mysql和redis安装
接上篇开始安装mysql和redis 注意了,如果用阿里云服务器,外网访问的端口必须在安全组开启,否则外网访问不通 三.服务器安装redis和mysql 本次环境搭建将所有第三方服务会安装在阿里云服务 ...
- Java基础90 MySQL触发器
1.创建触发器 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...
- SpringMVC+Mybatis+MySQL配置Redis缓存
SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...
- Docker运行Mysql,Redis,SpringBoot项目
Docker运行Mysql,Redis,SpringBoot项目 1.docker运行mysql 1.1拉取镜像 1.2启动容器 1.3进入容器 1.4开启mysql 1.5设置远程连接 1.6查看版 ...
随机推荐
- zookeeper 客户端 zkCli 命令详解
该文写的比较详细 https://blog.csdn.net/feixiang2039/article/details/79810102
- 【原】涉及数据库的单元测试-JTeser
JTeser方法之一:@DbFit 一.maven 依赖项 <dependency> <groupId>org.testng</groupId> <artif ...
- python学习用到的网站
官方地址:https://www.python.org/ 玩蛇网:http://www.iplaypython.com/
- 错误/异常:org.hibernate.MappingException: Unknown entity: com.shore.entity.Student 的解决方法
1.错误/异常视图 错误/异常描述:Hibernate配置文件 映射异常,不明实体类Student(org.hibernate.MappingException: Unknown entity: co ...
- Confluence 6 删除一个附加的文件
你需要具有 删除附件(Delete Attachment)的空间权限来删除一个附加的文件. 希望删除一个附加文件的所有版本: 进入含有附件的页面中. Go to > Attachments 选 ...
- 利用栈实现字符串中三种括号的匹配问题c++语言实现
编写一个算法,检查一个程序中的花括号,方括号和圆括号是否配对,若能够全部配对则返回1,否则返回0. Head.h: #ifndef HEAD_H_INCLUDED #define HEAD_H_INC ...
- Apache+php搭建
首先安装Apache -->下载 修改httpd.conf文件 # # This is the main Apache HTTP server configuration file. It co ...
- vue使用子路由时,默认的子路由视图不显示问题
解决办法是,将父级的name去掉.(大多数情况下是按name来跳转的,不过这样一改,调到父级就得用路径跳转了): 下面上一下路由的配置: { path: "/index", com ...
- bk复面-一场被问蒙蔽了的面试
1.自我介绍 ---自我介绍从个人生活上.兴趣爱好上去介绍,比如我自己,平时喜欢听听音乐.看看鸡汤类的书,比如爱下厨,喜欢根据一些网上的教程去尝试做一份自己满意的晚餐,简历上已经写得工 ...
- JavaWeb-SpringBoot_使用MySQL管理用户登录注册+接入腾讯短信SDK_demo
使用Gradle编译项目 传送门 项目已托管到Github上 传送门 JavaWeb-SpringBoot_一个类实现腾讯云SDK发送短信 传送门 用户注册 用户并非一定要输入正确的手机验证码去激活当 ...