基於 Redis 生成分散式訂單號
阿新 • • 發佈:2022-04-15
環境依賴:
//spingBoot <version>2.6.6</version> //jdk11 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
程式碼簡單易理解直接上成品;
package com.wyj.my_redis.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; /** * @author: yijun.wen * @date: 2022/4/15 11:00 上午 * @description: */ @Component public class OrderGenerateUtils { @Autowired private RedisTemplate redisTemplate; /** * 全域性自增數 */ private static int count = 1; /** * 格式化的時間字串 */ private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); private String REDIS_ORDER_NUM_KEY_PRE = "fms:order:"; /** * 生成16位訂單編號:8位日期+2位業務場景+6位以上 Redis 自增 id * * @param type 業務場景 * @return */ public String getOrderNum(int type) { StringBuilder sb = new StringBuilder(); String date = getNowDateStr(); // 拼接key值 String key = REDIS_ORDER_NUM_KEY_PRE + date; Long increment = incr(key, count); sb.append(date); // (動態匹配)2位業務場景 1:支付寶,2:微信,3:訂單編號 sb.append(String.format("%02d", type)); String incrementStr = increment.toString(); if (incrementStr.length() <= 6) { sb.append(String.format("%06d", increment)); } else { sb.append(incrementStr); } return sb.toString(); } /*** * * @param key * @param delta * @return */ public Long incr(String key, long delta) { Long increment = redisTemplate.opsForValue().increment(key, delta); if (increment.equals(1L)) { redisTemplate.expire(key, 1, TimeUnit.DAYS); } return redisTemplate.opsForValue().increment(key, delta); } /** * 獲取當前時間年月日字串 * * @return */ private static String getNowDateStr() { return sdf.format(new Date()); } }