From eaf25545a8126689e9d0851b194a745436e77934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= Date: Wed, 29 May 2019 09:47:29 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=A0=81=E5=86=9C?= =?UTF-8?q?=E5=B0=B1=E5=BA=94=E8=AF=A5=E5=86=99=E5=87=BA=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E7=9A=84=E5=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java/GoodsListController.java | 154 ++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 java/GoodsListController.java diff --git a/java/GoodsListController.java b/java/GoodsListController.java new file mode 100644 index 0000000..208d8d1 --- /dev/null +++ b/java/GoodsListController.java @@ -0,0 +1,154 @@ +/** + * 获取商品列表. + * + * @author 强哥 + */ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** 一个远程微服务接口, 商品相关的管理, 通过spring boot提供 */ +interface GoodsServiceAPi { + + /** + * 通过检索条件 获取商品列表 + * + * @param params + * @return + */ + ArrayList getGoodsList(Map params); +} + +/** + * 一个远程微服务接口, + * + *

优惠活动相关的接口 + * + *

通过spring boot提供 + */ +interface PromotionServiceAPi { + + /** 通过检索条件 获取商品列表 */ + Map getPromotionBygoodsId(Map params); +} + +/** + * 一个远程微服务接口, + * + *

价格相关的接口 + * + *

通过spring boot提供 + */ +interface PriceServiceAPi { + + /** 通过检索条件 获取商品列表 */ + Map getPriceBygoodsId(Map params); +} + +/** + * 一个远程微服务接口, + * + *

库存相关的接口 + * + *

通过spring boot提供 + */ +interface StoreServiceAPi { + + /** 通过检索条件 获取商品列表 */ + Map getStoreBygoodsId(Map params); +} + +// @RestController +// @RequestMapping("/api/goods/list") +public class GoodsListController { + + // 缓存处理 这里是一个map做的 + Map cache = new HashMap<>(); + + // @Inject + GoodsServiceAPi goodsServiceAPi; + + // @Inject + PriceServiceAPi priceServiceAPi; + + // @Inject + StoreServiceAPi storeServiceAPi; + // @Inject + PromotionServiceAPi promotionServiceAPi; + + // @RequestMapping("/list") + public ArrayList goodsList() { + // ==========各种商品筛选条件获取========== + + Map tj = new HashMap(); + + tj.put("price", "XXXX"); + + tj.put("Brand", "xxxx"); + + // ... 省略 很多条件 + + // ====================== + // 如果查询条件之前使用过,直接从缓存中返回 + ArrayList list = cache.get(tj); + + if (list != null) { + return list; + } + + list = goodsServiceAPi.getGoodsList(tj); + + for (Map g : list) { + Map p = new HashMap(); + + // ---组装条件------- + // p.put XXXX + // ------- + // 查库存 + try { + Map store = storeServiceAPi.getStoreBygoodsId(p); + + // 库存判断 + if (store.get("XXXX") == "XXXX") { + + // 查询促销信息 + Map prom = promotionServiceAPi.getPromotionBygoodsId(p); + + if (prom.get("XXXX") == "xxxx") { + + g.put("prom", prom.get("prom")); + // 这里组装满足促销的信息,下边查询促销后的价格 + // p.put XXXX + } + + // 查价格 + Map price = priceServiceAPi.getPriceBygoodsId(p); + + // 设置商品价格 + g.put("price", price.get("price")); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 缓存条件和结果 + cache.put(tj, list); + + return list; + }; + + // 上边的map 在实际中用的都是对应的对象封装类. + // 注释掉的代码为了保证编译通过 + // 上边代码实际非常复杂,洋洋几百行代码,出现了一个连环逻辑问题. + + // 坑: + // 咋一看 貌似没啥问题..高级码农挖的高级坑. + + // 1. 66行的map 是一个 线程不安全的 map.. + // 2. cache 没有缓存机制,如何释放内存 + // 3. 这些接口的服务都是提供在别的服务器上,通过http访问的... 这里写了循环中调用大量微服务,这些微服务内部还有 循环调用其他微服务, + // 把微服务当做简单的类使用了...并发上来后基本都卡死了. + // 4. 由于被缓存挡上了 当商品信息发生变化时候,再也看不到新的数据了. + // 5. 为了防止for循环挂掉添加了一个try.但是,没有考虑到循环中对list的数据进行了修改, list之后被缓存起来了. +} -- Gitee From f12b45e819037a5e5f7495e6f6da416d985fe11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= Date: Wed, 29 May 2019 09:49:49 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=A0=81=E5=86=9C?= =?UTF-8?q?=E5=B0=B1=E5=BA=94=E8=AF=A5=E5=86=99=E5=87=BA=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E7=9A=84=E5=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java/GoodsListController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/GoodsListController.java b/java/GoodsListController.java index 208d8d1..d8bebe9 100644 --- a/java/GoodsListController.java +++ b/java/GoodsListController.java @@ -150,5 +150,5 @@ public class GoodsListController { // 3. 这些接口的服务都是提供在别的服务器上,通过http访问的... 这里写了循环中调用大量微服务,这些微服务内部还有 循环调用其他微服务, // 把微服务当做简单的类使用了...并发上来后基本都卡死了. // 4. 由于被缓存挡上了 当商品信息发生变化时候,再也看不到新的数据了. - // 5. 为了防止for循环挂掉添加了一个try.但是,没有考虑到循环中对list的数据进行了修改, list之后被缓存起来了. + // 5. 为了防止for循环挂掉添加了一个try.但是,没有考虑到循环中对list的数据进行了修改, list之后被缓存起来了.出现异常的数据,里边价格,促销,等等信息都没有,导致调用该服务的地方挂了 } -- Gitee From e57f4e17420e2ee616c554aabcaa3587bdebd471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= Date: Wed, 29 May 2019 09:49:58 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=A0=81=E5=86=9C?= =?UTF-8?q?=E5=B0=B1=E5=BA=94=E8=AF=A5=E5=86=99=E5=87=BA=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E7=9A=84=E5=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java/GoodsListController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/GoodsListController.java b/java/GoodsListController.java index d8bebe9..8305441 100644 --- a/java/GoodsListController.java +++ b/java/GoodsListController.java @@ -150,5 +150,5 @@ public class GoodsListController { // 3. 这些接口的服务都是提供在别的服务器上,通过http访问的... 这里写了循环中调用大量微服务,这些微服务内部还有 循环调用其他微服务, // 把微服务当做简单的类使用了...并发上来后基本都卡死了. // 4. 由于被缓存挡上了 当商品信息发生变化时候,再也看不到新的数据了. - // 5. 为了防止for循环挂掉添加了一个try.但是,没有考虑到循环中对list的数据进行了修改, list之后被缓存起来了.出现异常的数据,里边价格,促销,等等信息都没有,导致调用该服务的地方挂了 + // 5. 为了防止for循环挂掉添加了一个try.但是,没有考虑到循环中对list的数据进行了修改, list之后被缓存起来了.出现异常的数据,里边价格,促销,等等信息都没有,导致调用该服务的地方挂了. } -- Gitee From e7c78806d10ff23cca13817b7276b19e8e525ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= Date: Wed, 29 May 2019 10:19:03 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=A0=81=E5=86=9C?= =?UTF-8?q?=E5=B0=B1=E5=BA=94=E8=AF=A5=E5=86=99=E5=87=BA=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E7=9A=84=E5=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/CompareVersion.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 js/CompareVersion.js diff --git a/js/CompareVersion.js b/js/CompareVersion.js new file mode 100644 index 0000000..477c6f6 --- /dev/null +++ b/js/CompareVersion.js @@ -0,0 +1,37 @@ +/** + * 版本号比较 版本号格式 1.2.3 + * @param v1 当前 + * @param v2 目标 + * + * @return 目标与当前比较 大于返回1 小于返回-1 相等 返回0 + * @constructor + */ +function CompareVersion(v1, v2) { + + v1 = v1.split("\\."); + v2 = v2.split("\\."); + + for (let i = 0; i < v1.length; i++) { + + if (v1[i] > v2[i]) { + return -1 + } else if (v1[i] < v2[i]) { + return 1; + } else { + return 0 + } + + } + +} + +console.info("%s : %s=%d ", "1.2.3", "1.2.4", CompareVersion("1.2.3", "1.2.4")) +console.info("%s : %s=%d ", "1.2.3", "1.2.3", CompareVersion("1.2.3", "1.2.3")) +console.info("%s : %s=%d ", "1.2.4", "1.2.3", CompareVersion("1.2.4", "1.2.3")) +console.info("====下边都不对======") +console.info("%s : %s=%d ", "1.12.3", "1.2.4", CompareVersion("1.12.3", "1.2.4")) +console.info("%s : %s=%d ", "12.2.3", "2.2.4", CompareVersion("12.2.3", "2.2.4")) +console.info("%s : %s=%d ", "1.2.3", "1.2.21", CompareVersion("1.2.3", "1.2.21")) +console.info("==========") +// 坑 +//没有考虑到 js弱类型的问题 不特殊处理,字符串比较式按照字典书序来的, 这样才会出现 2>12的情况 \ No newline at end of file -- Gitee From fb8869d4b845e6f17bf414ec8af9cff449b68b1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= Date: Wed, 29 May 2019 10:31:01 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=A0=81=E5=86=9C?= =?UTF-8?q?=E5=B0=B1=E5=BA=94=E8=AF=A5=E5=86=99=E5=87=BA=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E7=9A=84=E5=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/CompareVersion.js | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 js/CompareVersion.js diff --git a/js/CompareVersion.js b/js/CompareVersion.js deleted file mode 100644 index 477c6f6..0000000 --- a/js/CompareVersion.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * 版本号比较 版本号格式 1.2.3 - * @param v1 当前 - * @param v2 目标 - * - * @return 目标与当前比较 大于返回1 小于返回-1 相等 返回0 - * @constructor - */ -function CompareVersion(v1, v2) { - - v1 = v1.split("\\."); - v2 = v2.split("\\."); - - for (let i = 0; i < v1.length; i++) { - - if (v1[i] > v2[i]) { - return -1 - } else if (v1[i] < v2[i]) { - return 1; - } else { - return 0 - } - - } - -} - -console.info("%s : %s=%d ", "1.2.3", "1.2.4", CompareVersion("1.2.3", "1.2.4")) -console.info("%s : %s=%d ", "1.2.3", "1.2.3", CompareVersion("1.2.3", "1.2.3")) -console.info("%s : %s=%d ", "1.2.4", "1.2.3", CompareVersion("1.2.4", "1.2.3")) -console.info("====下边都不对======") -console.info("%s : %s=%d ", "1.12.3", "1.2.4", CompareVersion("1.12.3", "1.2.4")) -console.info("%s : %s=%d ", "12.2.3", "2.2.4", CompareVersion("12.2.3", "2.2.4")) -console.info("%s : %s=%d ", "1.2.3", "1.2.21", CompareVersion("1.2.3", "1.2.21")) -console.info("==========") -// 坑 -//没有考虑到 js弱类型的问题 不特殊处理,字符串比较式按照字典书序来的, 这样才会出现 2>12的情况 \ No newline at end of file -- Gitee