Redis?生成分布式業(yè)務(wù)單號(hào)的實(shí)現(xiàn)
背景:微服務(wù)架構(gòu),有三個(gè)微服務(wù),分別是簽收、對(duì)賬、開(kāi)票,需要生成唯一的分布式單號(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)是指在未來(lái)的某個(gè)時(shí)間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了三種常見(jiàn)的實(shí)現(xiàn)方法,感興趣的小伙伴可以參考一下2025-04-04Redis常用的數(shù)據(jù)結(jié)構(gòu)及實(shí)際應(yīng)用場(chǎng)景
本文介紹了Redis中常用的數(shù)據(jù)結(jié)構(gòu),包括字符串、列表、集合、哈希表、有序集合和Bitmap,并詳細(xì)說(shuō)明了它們?cè)诟鞣N場(chǎng)景下的使用,需要的朋友可以參考下2024-05-05Window server中安裝Redis的超詳細(xì)教程
這篇文章主要介紹了Window server中安裝Redis的教程,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法
這篇文章主要介紹了PHP分布式中Redis實(shí)現(xiàn)Session的方法,文中詳細(xì)介紹了兩種方法的使用方法,并給出了測(cè)試的示例代碼,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧,2016-12-12高效異步redis客戶端aredis優(yōu)劣勢(shì)原理解析
這篇文章主要介紹了高效異步redis客戶端aredis優(yōu)劣勢(shì)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09