高并发下如何生成唯一订单号?:互联网快速发展的今天,各类商城平台不计其数,商城及支付平台都有订单系统,订单系统里有一个关键元素就是订单号,订单号要具备:
互联网快速发展的今天,各类商城平台不计其数,商城及支付平台都有订单系统,订单系统里有一个关键元素就是订单号,订单号要具备全局唯一性。另外一方面,在分布式系统中也需要各种各样的ID,同样要求全局唯一性。
在一般项目中,我们要生成订单号可选的方案很多,比如说:
1、数据库自增长ID
优点:借助数据库实现,无需代码实现;
缺点:不能做水平分表,因为ID可能会重复;高并发场景下生成效率低速度慢;
2、时间戳 + 随机数
优点:实现起来简单
缺点:即使在相同的时间戳下随机数依旧存在重复的可能
3、会员ID + 时间戳
优点:同一时间内,同个用户不会存在两个订单号
缺点:会员ID泄露,存在一定风险
4、GUID、UUID
优点:简单
缺点:生成的订单号不友好、索引效率低下
所谓的高并发是指在较短时间段内服务器需要并行处理的请求数很多。在高并发场景下,同一秒可能会生成很多订单号,这样一来订单号就存在重复的可能性。
另外一方面,如果是多线程或者分布式环境下同一秒生成的重复订单可能性更大!
1、利用Redis原子递增来实现(推荐)
因为Redis本身就是单线程的,再借助其原子操作INCR、INCRBY完全可以生成全局唯一的ID,而且速度快。
2、时间戳 + 多个随机数 + 乐观锁
3、GUID转换为数字
以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!
高并发下如何生成唯一订单号(唯一主键),有几个方案和大家分享一下。
先说最笨的方法,利用数据库的自增长序列生成,数据库内唯一;数据库生成唯一主键,别的系统过来取;
优点:理解起来最容易,用起来也最容易。
缺点:也非常明显了,每种数据库的实现不同,如果数据库需要迁移的话比较麻烦;最大的问题是性能问题,因为题目中提到了【高并发下】,所以使用这个方法估计会很难满足性能需求。
Redis的单线程的,利用incr和increby;MongoDB的ObjectId;ZK通过znode数据版本;都可以生成全局的唯一标识码。
优点:性能高于数据库;可以使用集群部署。
缺点:需要引入对应的组件,增加系统的复杂度。
这个是分布式架构中,生成唯一标识码最常用的算法。UUID有基于MAC地址的,加上时间和时钟序列的,也有基于伪随机数的,基于加密哈希的。
优点:本地生成,不需要第三方组件,生成比较简单,性能好。
缺点:长度长,不利于存储,并且没有排序,是个字符串,不利于查询。解决无序问题,可参考Comb算法(combined guid/timestamp)。
Twitter开源,基于zk,41位时间戳(毫秒数)+10位机器的ID+12位毫秒内的流水号+1位符号位(永远是0)。
优点:性能不错,单机内递增。
缺点:依赖zk;依赖于机器时钟,分布式环境内可能会不是全局递增。
百度开源,基于snowflake算法。
美团开源。
优点:能保证全局唯一性、高可用、趋势递增(不太安全,比如泄露公司订单数量)、单调递增等。
缺点:依然会依赖第三方组件,zk或数据库。
1、UUID
2、数据库自增
3、Snowflake
4、Redis
这种方式比较方便,有现成可用的JAR包,但是也有缺点:ID可读性不好,而且会造成索引树频繁页分裂,影响数据库性能和空间使用
维护一张序列表。考虑到性能问题,不必每次生成ID都去操作数据库,可以设置一定的步长比如1000,每次从表中拿1000个序列号,从每台服务器内存中线性去取
维护一个序列号键值对,利用Redis自增的原子性,生成序列号
同一毫秒可以产生ID数量4194304个,优点是完全内存操作性能好,缺点是依赖于系统时钟一致性。如果某台机器的系统时钟回拨,有可能造成ID冲突,或者ID乱序
最重要的还是根据项目的场景,尤其是并发量,选择最合适的方法
请点击关注按钮【IT徐胖子】会持续为大家奉献互联网和技术干货内容,感谢支持
由于是高并发情况,所以不建议使用数据库自增ID,可以参考如下方案:
1、redis自增id
2、UUID
3、时间戳+随机数
4、Twitter的snowflake算法
5、利用zookeeper生成唯一id,性能不如redis
6、MongoDB的ObjectId,和snowflake算法类似
雪花算法足够了。我这边两个业务线都是用的雪花算法 完全能保证唯一。
华裔女赌王就此没落,生前让所有 浓情端午粽飘香,青浦邀你“云体 上海:“云端”展现端午节文化内 “甜咸大战”!明星艺人们喜欢什 如何做一个男人喜欢的情人(如何 当你和你同时出现在同一个场景中 如何在昏暗的光线下设置快门速度 教育在生活中的价值是什么? 世上做坏事的人死后会面临什么因 拜登就任总统后的第一步是什么? 同意/不同意:人生最重要的目标 二战后,德国在调和分歧方面做得 亚伯·林肯恨白人吗? 一个编辑能把你的故事毁得有多严 现在的iPhone6还能坚持再用一年 曹操为什么不杀司马懿? 现在买房是不是最便宜的时候,现 我身边的农业银行营业厅关了,AT 欧洲媒体评选CBA最有实力球员, 荣耀play的6+128和荣耀8X的6+128 蚂蚁集团是科技公司还是金融公司 请问机友华为mate30P与华为mate3 听说老詹修剪一次指甲需要5小时 为什么说宝宝“一月睡二月哭三月 戴笠人称戴老板,这个是怎么叫出 没有工作能一次性补缴社保么? 我想知道定向师范生和免费师范生 肺癌引起的咳嗽是怎样的呢? 5000mAh电池的5G手机推荐吗?要 恒大亚冠表现“差强人意”,你觉