1.关于订单号
订单号用于记录用户在电商网站中的下单信息(通常有商品列表、金额、时间等),用户下单后可根据订单号查询支付状态、物流状态等,也可以根据订单号进行投诉、反馈、售后咨询等。
订单号的生成通常要满足的需求:
1)唯一性:订单号不可重复,以免发生业务冲突
2)简短:便于记录、存储
3)业务相关性:可根据订单号定位相关业务
4)时间相关性:可根据订单号定位发生时间范围
5)有序性:订单号应当有序,便于建立索引,提高查询速度
6)安全性:订单号不应透露用户量、交易量等信息,也不要让别人随便就能拼出来。
马克思告诉我们,具体问题具体分析,生成订单号也应该以具体业务需求为准。先来看一下淘宝的3个订单号:
123736088576847054
121102577636847054
119636777937847054
twitter-scala版本: https://github.com/twitter/snowflake
java版本:https://github.com/downgoon/snowflake
想要在自己的项目中引入Snowflake很简单,可以引入其maven依赖,也可以直接复制其源代码(主要就一个Snowflake.java)到项目中。
使用Snowflake生成订单号(id)非常简单,需要注意的是其中两个参数的含义:
// dataCenterId可用于区分机器,workerId可用于区分业务
// datacenter: 2; workerId: 5
Snowflake snowflake = new Snowflake(2, 5);
long id1 = snowflake.nextId();
long id2 = snowflake.nextId();
如果需要解析生成的id,可以使用如下方式:
上图中arr[0-3]分别代表id生成的时间戳,机器标识,业务标识,序列号
当然,Snowflake算法虽然性能较高,但不一定符合实际业务,如果条件允许可以根据Snowflake源码做定制化实现,结合实际业务并汲取snowflake优秀的地方重新实现。
,