Redis?生成分布式業(yè)務(wù)單號(hào)的實(shí)現(xiàn)
背景:微服務(wù)架構(gòu),有三個(gè)微服務(wù),分別是簽收、對(duì)賬、開票,需要生成唯一的分布式單號(hào)
格式:標(biāo)識(shí) + 年月日 + 生成順序(三位)
例子:
- QS20230301001,即2023年三月一日第一張簽收單
 - DZ20230212002,即2023年二月十二日第二張對(duì)賬單
 
原理:利用 Redis 的原子性,保證三位生成順序的唯一性
新建業(yè)務(wù)id枚舉類 IdEnum
public enum IdEnum {
    SIGN("QS"),
    VERIFY("DZ"),
    INVOICE("KP"),
    RECEIPT("SK"),
    ;
    /**
     * 單號(hào)前綴
     */
    private String prefix;
    IdEnum(String prefix) {
        this.prefix = prefix;
    }
    public String getPrefix() {
        return prefix;
    }
}
新建 IdUtil
- getCacheKey:獲取 redis 的 KEY
 - getDay:獲取 服務(wù)標(biāo)識(shí) + 格式化的日期
 - completionSerial:從redis獲取生成順序后,格式化為固定三位
 
public class IdUtil {
    static final String  PREFIX = "ID_CASH_";
    public static String getCacheKey(String serialPrefix) {
        return PREFIX.concat(serialPrefix);
    }
    public static String getDay(IdEnum idEnum) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        StringBuffer sb = new StringBuffer();
        sb.append(idEnum.getPrefix());
        sb.append(formatter.format(LocalDateTime.now()));
        return sb.toString();
    }
    public static String completionSerial(Long serial) {
        Format formatCount = new DecimalFormat("000");
        String serialFormat = formatCount.format(serial);
        return  serialFormat;
    }
}
新建 IdService 獲取分布式單號(hào)
- dayWithPrefix :獲取 服務(wù)標(biāo)識(shí) + 格式化的日期
 - redisCacheKey:Redis key
 - serial:利用 redis increment 獲取原子自增數(shù)
 
@Service
public class IdService {
    @Resource
    private RedisTemplate redisTemplate;
    public String generateNumber(IdEnum idEnum) {
        String dayWithPrefix = IdUtil.getDay(idEnum);
        String redisCacheKey = IdUtil.getCacheKey(dayWithPrefix);
        Long serial = redisTemplate.opsForValue().increment(redisCacheKey);
        redisTemplate.expire(redisCacheKey, 2, TimeUnit.DAYS);
        String num =  dayWithPrefix + IdUtil.completionSerial(serial);
        return num;
    }
}
最后使用
String number = idService.generateNumber(IdEnum.INVOICE);
到此這篇關(guān)于Redis 生成分布式業(yè)務(wù)單號(hào)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis 生成分布式業(yè)務(wù)單號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
 Redis實(shí)現(xiàn)延遲任務(wù)的三種方法詳解
延遲任務(wù)(Delayed Task)是指在未來的某個(gè)時(shí)間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了三種常見的實(shí)現(xiàn)方法,感興趣的小伙伴可以參考一下2025-04-04
 Redis常用的數(shù)據(jù)結(jié)構(gòu)及實(shí)際應(yīng)用場(chǎng)景
本文介紹了Redis中常用的數(shù)據(jù)結(jié)構(gòu),包括字符串、列表、集合、哈希表、有序集合和Bitmap,并詳細(xì)說明了它們?cè)诟鞣N場(chǎng)景下的使用,需要的朋友可以參考下2024-05-05
 Window server中安裝Redis的超詳細(xì)教程
這篇文章主要介紹了Window server中安裝Redis的教程,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
 淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法
這篇文章主要介紹了PHP分布式中Redis實(shí)現(xiàn)Session的方法,文中詳細(xì)介紹了兩種方法的使用方法,并給出了測(cè)試的示例代碼,有需要的朋友可以參考借鑒,下面來一起看看吧,2016-12-12
 高效異步redis客戶端aredis優(yōu)劣勢(shì)原理解析
這篇文章主要介紹了高效異步redis客戶端aredis優(yōu)劣勢(shì)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

