redis+lua生成分布式自增单号

在并发场景下,原始的根据时间戳生成调价记录单号可能导致重复。为确保唯一性,采取时间戳结合redis自增数的策略。通过lua脚本在redis中执行自增操作,保证了原子性和隔离性,避免分布式系统中的并发问题。同时介绍了lua脚本在redis中的应用及其作为原子操作的优势。
摘要由CSDN通过智能技术生成

 

​问题:

最近在做价格系统的同步功能,简单描述下需求就是多家商城会跟随平台的采购成本和设置的毛利率而自动调整。每一次调整会生成批次记录。在测试环节发现生成的调价记录单号有重复的,我的第一判断是幂等没有控制好出现了重复插入的数据。经过排查发现,虽然单号是相同的但是它们的调价明细并不相同,由此可以排除幂等问题,它们并不是两条重复数据。翻看实现代码发现同事写的生成单号的规则直接用的时间戳代码如下:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");Long adjustNo = Long.valueOf(formatter.format(LocalDateTime.now()));

很明显在并发场景下如果两个单号在同一时刻(毫秒级)生成则会出现重复。如何解决这个问题?

 

分析:

生成单号是一个常规需求,单号作为单据信息的唯一标识,在很多业务场景中都需要生成单号,例如用户下单的订单号,设置记录的批次号,发货信息的发货单号等等。生成单号的策略要考虑到两个因素:

1、业务的并发量

2、未来的业务的增长量

 

生成的单号一般要满足以下三个条件:

1、唯一性,即每次生成的单号不能重复。

2、长度固定&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值