spring生成递增key值

news/2024/9/23 7:24:29/

需求:
在数据库中,某个字段需要根据规则生成唯一的字段。格式:TK+年+月+日+0000(从001开始递增),例如:TK202404200001。

所以我们自己手写一个代码来生成对应的code,并且自增。下面的代码先定义了几个固定的字段,例如前缀TK,以及redis里面的key(redis可替换成自己的可以即可),存在redis里面主要是为了快速获取最新的值,并且唯一性。然后根据获取的值+1处理,再把前缀拼接起来,就组成了一个唯一的id。
而且还要根据redis里面的值判断是不是今天的,如果不是今天的,就从0001开始递增。

java">/**根据redis中有无缓存生成平台客户编码*/private String createTkCustomerCode(){String prefix = "TK";String CUSTOMER_CODE_KEY = "CUSTOMER_CODE_KEY";StringBuilder response = new StringBuilder();String today = DateUtils.getReqDateyyyyMMdd(new Date());String currentCustomerCode = redisHelper.strGet(CUSTOMER_CODE_KEY);if (!StringUtils.isEmpty(currentCustomerCode) && isToday(prefix, currentCustomerCode)){String number = currentCustomerCode.substring(currentCustomerCode.length() - 4);int value;try {value = Integer.parseInt(number);} catch (Exception e) {Random random = new Random();value = random.nextInt(4999) + 4999;}int increaseValue = value + 1;String formatted = String.format("%04d", increaseValue);response.append(prefix).append(today).append(formatted);redisHelper.strSet(CUSTOMER_CODE_KEY, response.toString(),24, TimeUnit.HOURS);return response.toString();}//redis中无值response.append(prefix).append(today).append("0001");redisHelper.strSet(CUSTOMER_CODE_KEY, response.toString(),24, TimeUnit.HOURS);return response.toString();}/**判断是否是今天。eg:TK202404090001*/private boolean isToday(String prefix, String data){if (data.length() >= 14){String keyToday = data.substring(0,data.length() - 4).toUpperCase();String today = DateUtils.getCurrentDay("yyyyMMdd");return Objects.equals(keyToday, prefix + today);}return false;}

这个完全可以做成一个工具类来实现,就是要固定的格式,所以进阶版本如下代码。
进阶版本:

java">    /**** 根据自定义的prefix前缀,生成带时间戳的编码,输入编码前缀* 前缀+年月日+4位流水号** @param redisKey redis的key* @param prefix 前缀* @return*/public String getYYYYMMDD4Code(String redisKey, String prefix) {Long sequenceId = 1L;String reqDate = getReqDate();String redisName = redisKey + reqDate + prefix;if (redisHelper.strGet(redisName, Long.class) == null) {redisHelper.strSet(redisName, String.valueOf(sequenceId), getNowToNextDayMilliSeconds(), TimeUnit.SECONDS);//redisHelper替换成自己的redis即可} else {sequenceId = redisHelper.strIncrement(redisName, 1L);}DecimalFormat format = new DecimalFormat("0000");return prefix + reqDate + format.format(sequenceId);流水号}private final String YYYY_MM_DD_HH_MM_CODE_KEY = "business:app:YYYY_MM_DD_HH_MM_CODE_KEY:";/*** 生成带时间戳的编码,输入编码前缀* 前缀+年月日时分+6位流水号*/public String getYYYYMMddHHmm6Code(String prefix) {Long sequenceId = 1L;String reqDate = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());String redisName = YYYY_MM_DD_HH_MM_CODE_KEY + reqDate + prefix;if (redisHelper.strGet(redisName, Long.class) == null) {redisHelper.strSet(redisName, String.valueOf(sequenceId), getNowToNextDayMilliSeconds(), TimeUnit.SECONDS);} else {sequenceId = redisHelper.strIncrement(redisName, 1L);}DecimalFormat format = new DecimalFormat("000000");return prefix + reqDate + format.format(sequenceId);}public String getReqDate() {//yyyy-MM-dd 当前日期return new SimpleDateFormat("yyyyMMdd").format(new Date());}

但是这里还有一个问题,批量操作现有的数据,如果在单个线程里面操作,数据有5912条都需要530s,太耗时了,需要开线程来处理,这部分后面再聊。


http://www.ppmy.cn/news/1434963.html

相关文章

【第6节】Lagent AgentLego 智能体应用搭建

目录 1 基础课程2 安装环境2.1 教程要求2.2 安装 Lagent 和 AgentLego 3 实践操作3.1 Lagent:轻量级智能体框架3.1.1 Lagent Web Demo 使用3.1.2 用 Lagent 自定义工具 3.2 AgentLego:组装智能体“乐高”3.2.1 AgentLego 直接使用部分3.2.2 AgentLego We…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为: Python函数的黑魔法:递归,嵌套函数与装饰器 个人主页:CILMY23-CSDN博客 系列专栏:Python | C | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连&#xff…

Java中的异常和错误

Exception ArrayIndexOutOfBoundsException(数组下标越界) NullPionterException(空指针异常) ArithmeticException(算数异常) MissingResourceException(丢失资源) ClassNotFo…

谈谈mysql中的各个关键字

1.为什么学习mysql mysql是当今最主流且开放源码的关系型数据库,开发者为瑞典 MySQL AB 公司。目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低…

MIMO(多天线)通信的四种译码算法

目录 一. 介绍 二. 极大似然译码 三. 破零译码算法 四. 最小均方误差算法 五. 球形译码 一. 介绍 发射天线数记为Mt,接收天线数记为Mr。由此发射信号x为向量: 接受信号y为向量: 信道H为矩阵: 利用n代表噪声向量,…

Python基础:【习题系列】多选题(一)

在Python中,哪些关键字用于流程控制? A. if B. function C. while D. for 答案:A, C, D 关于Python中的数据类型,以下哪些说法是正确的? A. 列表是可变的 B. 元组是不可变的 C. 字典可以使用可变数据类型作为键 D. 集合不允许重复元素 答案:A, B, D 在Python中,以下哪些…

如何用PHP语言实现远程语音播报

如何用PHP语言实现远程语音播报呢? 本文描述了使用PHP语言调用HTTP接口,实现语音播报。通过发送文本信息,来实现远程语音播报、语音提醒、语音警报等。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备名称1…

mybatis映射postgres数据库的geometry类型

mybatis映射postgres数据库的geometry类型 文章目录 mybatis映射postgres数据库的geometry类型一、问题背景和需求描述二、解决步骤1、导入java类型转换需要的包2、自定义mybatis类型转换器(GeometryTypeHandler)3、注册类型转换器(springBoot项目)4、在实体类添加类型转换器…