订单号

对“关于购物车的想法”的一些回复

巧了我就是萌 提交于 2019-12-23 17:40:29
刚看到吴磊同学的一些 关于购物车的想法 ,正巧本人 丁学 对电子商务这方面比较熟悉,跳出来献丑了,希望对一些同行有些用处。本来想回复到下面的,结果发现写起来比较多,干脆写到这里好了,以后自己找起来也方便,呵呵 问题: 1.购物车中的数据是否应该存储在数据库中? 我特别想知道在真正的项目中,那些真正的软件工程师是如何考虑这个问题的。在Google上一搜,搜到了一篇咱园子里一位网友的观点:购物车应该是个临时存储数据的模块,他将其存放在Session对象中。这位网友说的很有道理,不过我并不喜欢这样的做法。如果大家都将其存储在Session对象中,成千上万个用户一同购物的话,想必ASP.NET服务器必将承受巨大的负载。也许像我们国内的网站可能会好一些,但想Amazon这样的网站,怎么做的呢?Amazon中国网站,也就是Joyo的网站,并不是将其存储在Session对象中,因为我如果这次放入购物车中的商品没有提交订单,下次登录后购物车中还会有这些商品。因此,我想他们可能是将这些购物车中的数据放入了数据库中。 回复: 把购物车存放在Session中,这种做法似乎只存在于大学里的课程设计或者一些无人在意的实习项目中出现。事实上,基本所有的电子商务网站都把购物车数据存放到了数据库里。下面是一些解释和设计上需要注意的地方: 1、Session并不适合做大数据量的数据存放

唯一订单号生成的那些事

霸气de小男生 提交于 2019-12-18 01:05:16
前言 在做项目中经常遇到需要唯一业务id的生成,比如:支付订单号,外卖订单号,地址id,用户id...等等,这样的场景太多了,今天就总结一下常用的生成方式。 排行榜 NO.1 UUID生成方式 基本上做过项目的都接触过jdk自带的UUID生成一串字符串,使用方式也很简单,如下: UUID.randomUUID().toString().replace("-",""); UUID应该是最常用也是最方便的一种生成方式了,基本上不会重复,之所以说基本上不会重复,是因为我遇到过重复的,机率很小很小,千万分之一的概率。 NO.2 时间戳+随机数 时间戳精确到毫秒+指定位数的随机数也是一种常用的生成方式,虽然这种做法也不能保证百分之百的不重复,但是一般公司都没这么大的QPS,所以在并发量不是特别高的场景下也是一种不错的手段。生成方式也很简单,如下: public class BusinessPrimaryKeyBuildUtil { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"); /** * 业务主键默认年月日时分秒毫秒+10位随机数 * * @return */ public static String build() {

深入理解幂等性

非 Y 不嫁゛ 提交于 2019-12-16 13:21:10
什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。 Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. 这里需要关注几个重点: 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。 幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。网络超时等问题,不是幂等的讨论范围。 幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。 什么情况下需要幂等 业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求

深入理解幂等性

百般思念 提交于 2019-12-16 07:48:10
什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。 Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. 这里需要关注几个重点: 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。 幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。 网络超时等问题,不是幂等的讨论范围。 幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。 什么情况下需要幂等 业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求

PHP生成唯一订单号

烂漫一生 提交于 2019-12-09 20:34:34
在日常的网站开发中,我们经常需要生成唯一的订单号。订单号太短,在高迸发情况下,很容易造成订单号重复事件,虽然是小概率事件。 下面我们使用PHP多个函数生成一个现在最常用的订单号格式: $order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); 加了毫秒,变成25位了,重复几率更小 $order_number = date('YmdHi'). substr(microtime(), 2, 5) .substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); 简单从内到外解析一下这个订单号生成过程: date("Ymd"):这个很容易理解,是在最前方拼接一个当前年月日组成的数字 uniqid():此函数获取一个带前缀、基于当前时间微秒数的唯一ID。 substr(uniqid(), 7, 13):由于uniqid()函数生成的结果前面7位很久才会发生变化,所以有或者没有对于我们没有多少影响,所以我们截取后面经常发生变化的几位。 str_split(substr(uniqid(), 7, 13), 1)

如何测试这个方法--功能篇

不羁岁月 提交于 2019-12-07 20:23:39
本文题目来自于知识星球,后台回复“知识星球”可参与问答。 前两日得到一个朋友的交流,他们有一个产生唯一订单号的功能,把代码单独提出来了,问这个方法有什么问题吗?改怎么测试? 先把代码放出来,如下: /** * 生产唯一的交易订单号 * * @return */ public static String createUniqueOrderNo() { SimpleDateFormat nyrsfm = new SimpleDateFormat("yyyyMMddHHmmss"); return nyrsfm.format(new Date()) + getRandomLengthCode(4); } /** * 获取随机的短信验证码 * * @return */ public static String getRandomLengthCode(int length) { return String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, length - 1))); } 第一个是生产订单号的,第二个是产生一个四位随机数的方法。先说第一个方法的思路:订单号分两部分,一是时间(按照这种 yyyyMMddHHmmss 格式的),第二部分就是四位随机数。第二个方法:产生一个[0,1)之间的double类型的数字

如何测试这个方法--功能篇

折月煮酒 提交于 2019-12-07 10:36:29
本文题目来自于知识星球,后台回复“知识星球”可参与问答。 前两日得到一个朋友的交流,他们有一个产生唯一订单号的功能,把代码单独提出来了,问这个方法有什么问题吗?改怎么测试? 先把代码放出来,如下: /** * 生产唯一的交易订单号 * * @return */ public static String createUniqueOrderNo() { SimpleDateFormat nyrsfm = new SimpleDateFormat("yyyyMMddHHmmss"); return nyrsfm.format(new Date()) + getRandomLengthCode(4); } /** * 获取随机的短信验证码 * * @return */ public static String getRandomLengthCode(int length) { return String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, length - 1))); } 第一个是生产订单号的,第二个是产生一个四位随机数的方法。先说第一个方法的思路:订单号分两部分,一是时间(按照这种 yyyyMMddHHmmss 格式的),第二部分就是四位随机数。第二个方法:产生一个[0,1)之间的double类型的数字

幂等策略分析

半城伤御伤魂 提交于 2019-12-06 02:28:19
原文链接; https://www.cnblogs.com/geyifan/p/6128425.html 幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。 举个栗子,双十一零点刚过,小明就迫不及待地点击提交订单按钮,选择在线支付,点了确认支付按钮,这时候网络有些慢,小明担心心爱的商品被抢购一空,就点了多次确认付款按钮,如果这个订单扣款多次,客服热线估计会被小明打爆。 什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源 对于资源本身 应该具有同样的副作用(网络超时等问题除外)。也就是说, 其任意多次执行对资源本身所产生的影响均与一次执行的影响相同 。 Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. 这里需要关注几个重点: 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改

设计模式 - 策略模式

谁都会走 提交于 2019-12-03 22:35:42
在理解策略模式之前我们假设有这样一个需求场景:我们在写订单支付场景的代码时,客户可以选择多种支付方式,有银联支付、支付宝支付、微信支付、京东白条等等。然后我们就很可能就会编写出类似下面这样的代码: /** * 订单类,拥有一个支付方法 * * @author eamon.zhang * @date 2019-11-06 上午9:18 */ public class Order { // 订单id private String orderId; // 支付方式 private String payType; // 订单金额 private long amount; public Order(String orderId, String payType, long amount) { this.orderId = orderId; this.payType = payType; this.amount = amount; } /** * 订单支付方法 * * @return */ public boolean pay() { // 是否支付成功 boolean payment = false; if ("aliPay".equals(payType)) { System.out.println("用户选择 支付宝 支付,订单号为:" + orderId + " ,支付金额:" +