吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1403|回复: 12
收起左侧

[求助] springboot生成订单号问题

[复制链接]
森岛帆高 发表于 2022-12-12 01:28
最近在学springboot,有个需求是生成订单号,格式规则如下:
yd-20221029-0001
固定前缀-日期-当日单数,隔日从0开始

在学习过程中发现有的网上的做法是写个mapper直接从数据库取当天最大单号+1,然后实体类set后插入数据库。
这样写的话如果多个用户同时创建订单是否可能出现订单号重复问题,这种需求应该挺常见的,但不太清楚如何做比较合理,麻烦各位大佬帮忙看看

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

就是他 发表于 2022-12-12 01:47
    public static String createStr(String prefix) {
        return prefix + DateUtil.toString(new Date(), "yyyyMMdd") + SnowFlake.getId();
    }
siegod 发表于 2022-12-12 04:59
解决方法:
第一种: for update 加锁 或者 redis分布式锁 再操作mysql查询、更新 ;

优点:严格递增   
缺点 : 数据库存在性能瓶颈

第二种:使用redis incr指令进行原子操作递增,返回新值

优点:严格递增;无需加锁,性能好;可设置过期时间自动对key进行回收
缺点:强依赖redis,宕机容易导致一段时间不可以用。

第三种:号段模式+本地缓存,每次获取一批id进行本地缓存,通过guava cache可设置本地缓存过期时间及时0点清理

优点:趋势递增;业务服务分摊数据存储中间件写并发;弱依赖数据存储中间件,通过本地缓存可在宕机期间提供服务

缺点:安全性不好,容易泄露发号数量的信息

第四种 雪花算法

优点: 趋势递增;本地生成性能好;安全性好,竞争对手无法通过id计算发号数量

缺点:时钟回拨

免费评分

参与人数 5吾爱币 +4 热心值 +3 收起 理由
森岛帆高 + 1 我很赞同!
两只小蜜蜂 + 1 + 1 我很赞同!
疯狂的瑞兽 + 1 我很赞同!
898522783 + 1 + 1 我很赞同!
ck6102 + 1 我很赞同!

查看全部评分

kimchow 发表于 2022-12-12 07:44
lsy_loren 发表于 2022-12-12 08:35
三楼说得对
qPHPMYSQL 发表于 2022-12-12 09:12
建议是用雪花算法,虽然生成的ID不是你要的这种,但是可解密出日期,最大数量可跟在ID后面,别人也猜不出来
RenGuiSong 发表于 2022-12-12 09:13
可以看看美团的开源项目leaf,订单号生产策略。
wangqh761117 发表于 2022-12-12 09:48
本帖最后由 wangqh761117 于 2022-12-12 09:50 编辑

按你的需求,应该用主键回填就可以了
<insert id="save" useGeneratedKeys="true" keyProperty="id">
...

orderMapper.save(order);

完了之后,再order.getId()就能拿到自增长的id值
xQQ 发表于 2022-12-12 10:13
siegod 发表于 2022-12-12 04:59
解决方法:
第一种: for update 加锁 或者 redis分布式锁 再操作mysql查询、更新 ;

大佬的方案很全面呀
mao3661280 发表于 2022-12-12 10:18
三楼说的对
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表