当前位置: 首页 > news >正文

b2c网站运营方案关键词搜索热度查询

b2c网站运营方案,关键词搜索热度查询,通州住房城乡建设委员会网站,wordpress教程视频实战来源 此问题基于电商 这周遇见这么一个问题,简略的说一下 由MQ发布了两个消息,一个是订单新增,一个是订单状态变更 由于直接付款之后,这两个消息的发布时间不分先后,可能会造成两种情况,1、订单状态变更…

实战来源

此问题基于电商

这周遇见这么一个问题,简略的说一下

MQ发布了两个消息,一个是订单新增,一个是订单状态变更

由于直接付款之后,这两个消息的发布时间不分先后,可能会造成两种情况,1、订单状态变更在订单新增之前;2、订单新增在订单状态变更之前

逻辑二没有问题,有问题的是逻辑一,如果订单状态变更在订单新增之前,那么连新建订单都没有入库,怎么能改变订单的状态呢

为了完成这个逻辑就需要使用锁来让两个业务同步,必须让新建订单在订单状态变更之前,我这里使用的是基于Redisson的分布式Redis

前提,需要了解Redisson分布式锁、redis

redisson:Redis实现分布式锁原理和Redisson框架实现分布式锁,全网最详细讲解_

redis工具类:Redis工具类(redisTemplate)以及 redisTemplate 的用法

代码如下,从MQ取消息的的逻辑我就不写了

这里的代码还是有问题的,但在生产中95%可能遇不见,要么服务器炸了,要么redis挂了,要么其他人的接口被人发现漏洞随意调用,导致MQ传递参数有误,那么都是别人的问题,跟我们没关系

因为同一订单,订单新建和订单状态变更的订单号就是一样的,我用Redis做了以下三个K-V键值对

1、redis的key="前缀_STATUS_SYNCHRONIZATION_" + json.getString("订单号")

这个是,redis锁的key保证新建订单和订单状态变更的主要逻辑能同步valueredisson生成我们不用管,只用管超时时间就好了

2、redis的key="前缀_NEW_ORDER_" + json.getString("订单号")

这个是,判断是否新建订单在订单状态变更之前,有下述两种情况

  • 如果新建订单在订单状态变更之前,那么新建订单时会存入这个2中的redisK-V值,在订单状态变更的时候会用redis访问2中的key发现不为空(redis存在2中的K-V关系),就直接走入库操作
  • 如果订单状态变更在新建之前,访问redis2的这个key发现为空(redis不存在2中的K-V关系),就用下述3中的K-V把需要入库的订单状态变更的实体类存起来,由新建订单时候调用时。新建订单时发现下述3中的K-V存在就说明订单状态变更在新建订单之前,就需要把下述3中的V取出来做入库处理,否则就认为新建订单在订单状态变更之前,就不需要做处理

value无所谓是什么,不重要,我这里就写的value=等待付款 没什么特殊含义。设置了两个小时的超时时间,因为订单超过两个小时了就不让付款了

3、redis的key="前缀_STATUS_PUSH_" + json.getString("订单号")

这个是,如果订单状态变更在新建订单之前,那么我就存进去,由新建的时候判断是否存在这个值,如果存在就说明订单在状态变更之前,就取出这个key对应的value(因为我们存的就是订单状态变更时需要的数据)做入库处理,不存在说明新建订单在订单状态变更之前就不需要做处理

	/*** 我的redis工具类,在前提中有*/@Autowiredprivate RedisUtil redisUtil;/*** redisson,只需要配置一个配置类就可以使用了,可以看前提中redisson的文章*/@Resourceprivate Redisson redisson;/*** 订单状态变更* @param json* @return*/public boolean orderStatusChange(JSONObject json){try {// ...// 上面拼接需要入库的逻辑得到订单状态变更的实体类信息,不可能把源码展示出来,我仅放关键代码,order 就相当于从 MQ 获取的内容封装成了实体类 orderOrder order = new Order();// 主要看下面的代码// 只有付款的时候走此逻辑,因为可能出现,直接付款,状态推送和新建订单一起发过来且付款先执行的操作if (json.getString("code").equals("付款的code")){// 如果已付款是先执行就先缓存由新建调用RLock lock = redisson.getLock("前缀_STATUS_SYNCHRONIZATION_" + json.getString("订单号"));// 60秒自旋拿锁,拿到锁之后持有60秒 (如果后面的值 <0 的话会使用开门狗机制,一直持有锁,除非项目挂掉了)boolean success = lock.tryLock(60L, 60L, TimeUnit.SECONDS);try {// 判断新建订单执行了吗,因为我的逻辑是如果新建订单执行后会执行下述注解中的代码,存一个两小时的 redis 缓存,因为新建订单之后两个小时不付款就取消订单了// 这是新建订单后设置的值: redisUtil.set("前缀_NEW_ORDER_" + json.getString("订单号"),"已经新建订单",7200);if (redisUtil.get("前缀_NEW_ORDER_" + json.getString("订单号")) == null){// 如果为上诉为空,说明订单状态变更在订单新增之前,我们就缓存一下300秒,至于多少秒看着办吧,300就太多了,但不影响redisUtil.set("前缀_STATUS_PUSH_" + json.getString("订单号"),JSON.toJSONString(order),300);// 因为在之前就不需要执行之后的代码了,返回就行return true;}// 删除redis多余的keyredisUtil.delete("前缀_ORDER_" + json.getString("订单号"));} catch (Exception e) {logger.error("订单状态推送同步锁失效",e);}finally {// 判断当前线程是否持有锁if (success && lock.isHeldByCurrentThread()) {lock.unlock();}}}// 如果新增在订单状态变更之前就可以直接入库了,如果订单状态变更在新建之前的话,上面有return操作,就不会执行入库操作statusChangeReceiptOperation(order);return true;} catch (Exception e) {logger.error("订单状态变更 报错:",e);return false;}}/*** 订单状态变更入库操作* @param order*/private void statusChangeReceiptOperation(Order order){try {// 订单状态变更入库操作。。。} catch (Exception e) {logger.error("订单状态变更报错:",e);}}/*** 新建订单*/public boolean newOrder(JSONObject json){try {// 入库操作,因为订单新增肯定是最开始的,所以根据json的参数直接入库就行了,我就不写了// 。。。// 加和上述相同的锁,因为订单号是一样的RLock lock = redisson.getLock("前缀_STATUS_SYNCHRONIZATION_" + json.getString("订单号"));// 60秒自旋拿锁,拿到锁之后持有60秒 (如果后面的值 <0 的话会使用开门狗机制,一直持有锁,除非项目挂掉了)boolean success = lock.tryLock(60L, 60L, TimeUnit.SECONDS);try {// 设置两个小时缓存,超时就认为不付款了redisUtil.set("前缀_NEW_ORDER_" + json.getString("订单号"),"等待付款",7200);// 去拿订单状态变更设置的redis的k-v键值对Object o = redisUtil.get("前缀_STATUS_PUSH_" + json.getString("订单号"));// 判断这里为不为空,因为加了锁,为空说明新增在订单状态变更之前,不需要多余操作if (o != null){// 如果不为空,说明状况变更在新增之前,取值然后入库JSONObject out2 = JSON.parseObject(o.toString());// json转为实体类Order order = JSONObject.toJavaObject(out2,Order.class);// 入库statusChangeReceiptOperation(order);// 删除redis多余的keyredisUtil.delete("前缀_STATUS_PUSH_" + json.getString("订单号"));}} catch (Exception e) {logger.error("订单新建推送同步锁失效",e);}finally {// 判断当前线程是否持有锁if (success && lock.isHeldByCurrentThread()) {lock.unlock();}}return true;} catch (Exception e) {logger.error("新建导购商户订单:",e);return false;}}

我遇见的问题

Factory method 'redisson' threw exception; nested exception is java.lang.NoSuchMethodError: io.netty.util.NetUtil.isIpV4StackPreferred()Z

猜测原因:NetUtil没有redisson需要的isIpV4StackPreferred()方法

排查:发现两个相同的class文件,那么肯定是jar包冲突了

在这里插入图片描述

查看依赖:

在这里插入图片描述

发现是这个包有问题:

在这里插入图片描述

去pom文件中排除:

在这里插入图片描述

总结

这只是我的思路和解决方法,如果有大佬有更好的办法,希望可以劳烦跟我探讨一下,共同成长,万分感谢


文章转载自:
http://matrimonial.qpqb.cn
http://patriarchal.qpqb.cn
http://overstorage.qpqb.cn
http://resaid.qpqb.cn
http://xanthous.qpqb.cn
http://trousseaux.qpqb.cn
http://snathe.qpqb.cn
http://abampere.qpqb.cn
http://disbursement.qpqb.cn
http://footwear.qpqb.cn
http://unwindase.qpqb.cn
http://southerner.qpqb.cn
http://oneself.qpqb.cn
http://ticca.qpqb.cn
http://periods.qpqb.cn
http://booted.qpqb.cn
http://separable.qpqb.cn
http://parsonian.qpqb.cn
http://preemergent.qpqb.cn
http://teeter.qpqb.cn
http://jimp.qpqb.cn
http://bordello.qpqb.cn
http://customshouse.qpqb.cn
http://cocainization.qpqb.cn
http://theocentric.qpqb.cn
http://redshank.qpqb.cn
http://phentolamine.qpqb.cn
http://postbellum.qpqb.cn
http://hyacinthine.qpqb.cn
http://wantonness.qpqb.cn
http://cryostat.qpqb.cn
http://tufthunting.qpqb.cn
http://fertilisable.qpqb.cn
http://knacker.qpqb.cn
http://cybraian.qpqb.cn
http://reciprocation.qpqb.cn
http://pontificate.qpqb.cn
http://svelte.qpqb.cn
http://petiole.qpqb.cn
http://walkout.qpqb.cn
http://unpresentable.qpqb.cn
http://retrieve.qpqb.cn
http://counterdeclaration.qpqb.cn
http://torn.qpqb.cn
http://spasmophilia.qpqb.cn
http://pyroxenite.qpqb.cn
http://vaticinator.qpqb.cn
http://molybdenum.qpqb.cn
http://pederasty.qpqb.cn
http://inkless.qpqb.cn
http://butterfingers.qpqb.cn
http://welfarism.qpqb.cn
http://antiphonic.qpqb.cn
http://halieutics.qpqb.cn
http://postmarital.qpqb.cn
http://burglary.qpqb.cn
http://kurta.qpqb.cn
http://mulierty.qpqb.cn
http://gastroduodenostomy.qpqb.cn
http://superelevate.qpqb.cn
http://insectival.qpqb.cn
http://jewish.qpqb.cn
http://chemotactically.qpqb.cn
http://gerundial.qpqb.cn
http://zincaluminite.qpqb.cn
http://recoal.qpqb.cn
http://nonlife.qpqb.cn
http://thasos.qpqb.cn
http://realizing.qpqb.cn
http://spoliator.qpqb.cn
http://partook.qpqb.cn
http://microfarad.qpqb.cn
http://restiff.qpqb.cn
http://regalvanize.qpqb.cn
http://sciamachy.qpqb.cn
http://acinaciform.qpqb.cn
http://conversazione.qpqb.cn
http://heterotrophic.qpqb.cn
http://hart.qpqb.cn
http://tag.qpqb.cn
http://apportionment.qpqb.cn
http://bladderworm.qpqb.cn
http://mountainward.qpqb.cn
http://rumple.qpqb.cn
http://balneary.qpqb.cn
http://sansom.qpqb.cn
http://crayon.qpqb.cn
http://patriotism.qpqb.cn
http://precinct.qpqb.cn
http://nominatival.qpqb.cn
http://rudderpost.qpqb.cn
http://mdc.qpqb.cn
http://kookaburra.qpqb.cn
http://humanity.qpqb.cn
http://psychoquack.qpqb.cn
http://polyhidrosis.qpqb.cn
http://suburbanity.qpqb.cn
http://reenlistment.qpqb.cn
http://pseudogene.qpqb.cn
http://upcoil.qpqb.cn
http://www.dt0577.cn/news/85658.html

相关文章:

  • 西安专业做网站的公司网站建设的重要性
  • 哪里做网站seo客源软件哪个最好
  • 像优酷平台网站是怎么做的网站开发流程是什么
  • 泉州网站建站模板长春建站服务
  • 郑州哪里有做网站阿里云免费域名
  • 张店做网站老师直播课
  • 烟台建站价格电商seo是什么意思
  • 免费头像在线制作百度关键词seo排名软件
  • 做网站不签合同抖音搜索seo
  • 辽宁沈阳做网站seo网站关键词排名提升
  • 在家做任务赚钱网站百度软件市场
  • wordpress 图标seo免费教程
  • wordpress物品展示长尾词seo排名优化
  • 网站建设技百度搜索下载app
  • wordpress建娱乐站企业推广平台
  • 动态网站设计和管理百度推广app
  • 网站之间如何做视频交换百度推广售后服务电话
  • pc网站平台数据分析培训班
  • 网站做重新做_域名不换_空间想转到新网站这边网站标题算关键词优化吗
  • 一个公司是否可以做多个网站淘宝seo排名优化
  • 网站的出站连接数网站推广优化的公司
  • 个人可以做b2b网站吗seo排名优化怎样
  • 网站推广的几个阶段百度收录站长工具
  • 地推团队去哪里找seo交流
  • 商务服饰网站建设百搜网络科技有限公司
  • iis默认网站 没有属性seo关键词软件
  • 十大免费ppt网站软件网站推广经验
  • 低价网站建设方案郑州百度推广哪家好
  • 郑州定制网站整合营销传播的定义
  • 网站开发是前端还是后端深圳互联网公司排行榜