通过Redis实现Java流水编号
通过redis的increment方法来记录流水编号,java中经常会用到固定字符+日期+几位流水号的编号格式,这里记录一下生成编号的通用类。我重写了两个方法,一个带日期格式的,一个没有日期格式的;
实现代码如下:
public class NumberUtils {private NumberUtils() {}/*** 编号自动生成** @param redisTemplate redis模板* @param code 前缀 首字母大写* @param nums 几位数字* @return 编号*/@NotNullpublic static String generateSerialNum(RedisTemplate redisTemplate,String code, Integer nums) {// nums位数字,不够的前面补0val format = String.format("%%0%dd", nums);// 返回拼接好的编号return code +// redisKey组成:前缀,确保每天都是新的key,编号从0001开始String.format(format, getIncrement(redisTemplate, code));}/*** 编号自动生成** @param redisTemplate redis模板* @param code 前缀 首字母大写* @param dateFormat 日期格式* @param nums 几位数字* @return 编号*/@NotNullpublic static String generateSerialNum(RedisTemplate redisTemplate,String code, String dateFormat, Integer nums) {// nums位数字,不够的前面补0val format = String.format("%%0%dd", nums);// 返回拼接好的编号return code + DateUtils.formatDate(new Date(), dateFormat)// redisKey组成:前缀+格式化后的具体日期,确保每天都是新的key,编号从0001开始+ String.format(format, getIncrement(redisTemplate, code + DateUtils.formatDate(new Date(), dateFormat)));}private static Integer getIncrement(@NotNull RedisTemplate redisTemplate, String redisKey) {return Optional.ofNullable(redisTemplate.opsForValue().get(redisKey))// 返回redis里的值 + 1.map(num -> Objects.requireNonNull(redisTemplate.opsForValue().increment(redisKey)).intValue())// 如果redis里没有,则插入1并通过判断插入是否成功来返回初始化值1,如果插入失败,则返回拼接null.orElse(Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(redisKey, 1)) ? 1 : null);}
}
需要注意的是 RedisTemplate不能直接用new的方式来实例化,会抛出如下异常:
template not initialized; call afterPropertiesSet() before using
必须使用JavaBean实例化方式注入:
@Autowiredprivate RedisTemplate redisTemplate;
调用方法一:
NumberUtils.generateSerialNum(redisTemplate, CodeConstant.CL, CodeConstant.DATE_FORMAT, CodeConstant.FOUR);
调用方法二:
NumberUtils.generateSerialNum(redisTemplate, CodeConstant.CLS, CodeConstant.NINE);
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
