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查看版 ...
随机推荐
- cefsharp文档
原文链接:https://github.com/cefsharp/CefSharp/wiki/CefSharp中文帮助文档#a1_1 CefSharp中文帮助文档 目录 基础知识 1.1 cefsha ...
- 浏览器表单自动填充默认样式 - autofill问题解决
这不知道是个什么神仙网站,解决办法写的这么清楚,页面有这么让人舒服 https://lhajh.github.io/css/chrome/2018/04/17/The-chrome-browser-f ...
- jquery resize()方法 语法
jquery resize()方法 语法 作用:当调整浏览器窗口的大小时,发生 resize 事件.resize() 方法触发 resize 事件,或规定当发生 resize 事件时运行的函数.大理石 ...
- java常用检验接口control方式
@Controller public class ItemController { @Autowired private ItemService itemService; @RequestMappin ...
- Java进阶知识03 Hibernate的基础配置详解
1.Hibernate的原理/流程步骤 1.通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件,并创建一个configuration对象 ...
- 数据分析-excel数据分析(数据分析师岗位分析)
使用的函数:字符截取函数:LEFT(),MID() 定位函数:FIND() 统计函数:COUNTIF() 1.获取薪资的区间的最小值min和最大值max 处理方法:新插入多列,使用find()定 ...
- Android中定义广播监听,其他页面发送
private LocalBroadcastManager broadcastManager; /** * 注册广播接收器 */ private void receiveAdDownload() { ...
- gitk、Git GUI 图形化工具中文显示乱码的解决方案
在Windows下使用gitk.Git-Gui时,可能会出现代码中的中文乱码的情况.解决方法:在软件的安装目录下,在Git\mingw64\etc\gitconfig文件末尾添加: [gui]enco ...
- 2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础
2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础 1.基础问题 SQL注入攻击原理,如何防御 原理: SQL注入指攻击者在提交查询请求时将SQL语句插入到请求内容中,同 ...
- Nginx数据结构之红黑树ngx_rbtree_t
1. 什么是红黑树? 1.1 概述 红黑树实际上是一种自平衡二叉查找树. 二叉树是什么?二叉树是每个节点最多有两个子树的树结构,每个节点都可以用于存储数据,可以由任 1 个节点访问它的左右 子树或父节 ...