谈谈电商秒杀高并发的处理

谈谈电商秒杀高并发的处理众所周知现在连市场卖菜的大妈都快知道高并发了,哈哈,那么我们生活中是否接触过高并发呢。当然了哈哈,比如你给你女朋友抢秒杀的化妆品什么的了。秒杀最棘手的问题就是解决并发带来的问题。下面我们一起聊聊喽。首先我们来说下问题:秒杀高并发带来的最大问题,就是库存超卖。(如果你没看过我的文档,导致你写公司秒杀业务时库存超卖了,公司损失了,将你开除了,你会多么不开心,哈哈我来给你写稻草救救你)嘻嘻嘻嘻嘻…

大家好,又见面了,我是你们的朋友全栈君。

众所周知现在连市场卖菜的大妈都快知道高并发了,哈哈,那么我们生活中是否接触过高并发呢。当然了哈哈,比如你给你女朋友抢秒杀的化妆品什么的了。秒杀最棘手的问题就是解决并发带来的问题。下面我们一起聊聊喽。

首先我们来说下问题:秒杀高并发带来的最大问题,就是库存超卖。(如果你没看过我的文档,导致你写公司秒杀业务时库存超卖了,公司损失了,将你开除了,你会多么不开心,哈哈我来给你写稻草救救你)

嘻嘻嘻嘻嘻嘻嘻

解决方案:解决高并发导致库存超卖问题的核心思想就是,库存扣减要保证串行化操作

1.数据库层面解决方案:

    这种方式实现起来最简单,就是利用乐观锁。

    update product set num=num-1 where num-1>0 and pid=#{pid}

    使用此方法一定要注意,set num 时一定不要使用,set num=#{num},这样做的话不能保证原子化操作,并发还是会有问题(覆盖更新)。

    缺点:数据库存在瓶颈,首先是连接数,更重要是多个请求更新一条数据,会互相检查是否死锁(笛卡尔积)。而秒杀问题就是请求量大并发高。那怎么办?继续看小老弟说咯。

2.使用缓存(Redis等)解决方案:

    使用缓存确实可以解决数据库瓶颈的问题,例如Redis天然的串行化操作(Redis单线程),并且在数据内存中做操作很快。

    使用Redis的自增incr或自减decr操作库存,判断返回结果是否为0,如果为0表示秒杀失败。这样不就保证了库存的不超卖。

    此时你可能说,啊我明白了不就是用Redis的缓存来搞吗,简单简单。本大侠哈哈一笑,要是这样的话本大侠不也去BAT了。

=================下面才是关键=========================================

说说我们目前满意的Redis方案的问题吧。

先说一个优化的问题:

1.每次我们通过Redis查询库存都是通过远程连接的方式,虽然很快,但是并发大的时候,这里还是要优化一下的。

怎么优化?简单的说就是,当发现Redis库存为0时,我们在程序中设置一个标识位,秒杀逻辑中每次进来先判断标志位。这样库存为0时就直接返回,而不用再远程连接查询Redis了。

你可能会说这样就行了吧?对于一般的秒杀来说应该可以了,但我还要和大家说说更多的优化和优化时的问题,希望对大家的工作有好的提示或者帮助,那样我会很高兴的。哈哈

2.每次当我们秒杀成功后,会创建订单、通知库房、通知快递等一系列操作,如果我们把这些操作也放在秒杀时来处理,那么我们程序处理起来可想而知,会很慢的。那么这时我们就要优化,怎么优化?

实现异步处理,我们可以通过MQ(RocketMQ等消息队列)来实现异步处理,当用户秒杀成功后,我们发送消息给其他服务,然后返回给用户秒杀结果,这样是不是就很快了呢。对是快了。

那么问题来了:用户秒杀成功后需要付款,但是此时是异步操作,队列可能并没有处理完消息,怎么办怎么办?哈哈,这时我们需要在前端加一个轮询,轮询什么?轮询查询秒杀的结果(象征的意思意思用户,排队中什么什么的了)。下面代码

谈谈电商秒杀高并发的处理

简单讲讲这段代码:首先判断登录就不说了,后面通过用户名查询下当前用户是否秒杀成功了,然后然后问题来了,哈哈为什么我下面要使用了数据库查询?而不是查询缓存中的商品数量是否为0,因为还是之前的问题,队列没有消化完,用户秒杀成功的记录还没有生成,如果查询数据库商品没有了,那就代表队列已经处理完了,代表你秒杀失败了GG。如果还有库存,那么返回success(0)告诉用户排队中。直到数据库中库存没有了,那么代表队列处理完了,这时候你在查询Redis应该有订单信息的,如果没有那么你真的是秒杀失败了。讲到这里可能大家理会的差不多了,但是这段代码中还是存在问题?什么问题呢,那就是当他查询Redis时队列消息还是没处理她的消息,当他查询数据库之前,队列处理完了,这样你查数据库发现库存没有了,你就会返回秒杀失败,但其实你是秒杀成功的。这样还是会影响用户体验的。你可能会说不能吧,那么巧。哈哈我就是要和你说高并发下这种情况出现很正常。所以呢,我们要防止,怎么防止呢?

终极解决方案:

谈谈电商秒杀高并发的处理

我们在查数据库判断库存为0时(标记:数据库库存为0,消息肯定处理完了,也就是redis肯定有订单了,因为有妹子问了,我必须更新一下哈哈),我们再次查询Redis里是否已经有生成的订单了,这样就避免了问题咯。这也就是江湖中传闻的江湖秘诀,双重校验锁,哈哈,其实关于秒杀啊高并发的问题还有很多,这类问题每一行代码都是要考虑很多情况的,希望我再这里能给大家一个抛砖引玉的作用。小老弟要睡觉了,如果哪里说得不对别喷啊,都同行哈哈哈。

   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138411.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iden2021.3激活码破解方法

    iden2021.3激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    57
  • HTTP.sys远程执行代码漏洞验证及复现——CVE-2015-1635、MS15-034[通俗易懂]

    HTTP.sys远程执行代码漏洞验证及复现——CVE-2015-1635、MS15-034[通俗易懂]目录漏洞概述漏洞环境部署漏洞验证漏洞利用:ms15_034漏洞防御漏洞概述HTTP.sys简介HTTP.sys是MicrosoftWindows处理HTTP请求的内核驱动程序,为了优化IIS服务器性能,从IIS6.0引入,IIS服务进程依赖HTTP.sys。HTTP.sys远程代码执行漏洞实质是HTTP.sys的整数溢出漏洞漏洞成因远程执行代码漏洞存在于…

    2022年7月25日
    58
  • 电平转换的作用_电平转换电路原理

    电平转换的作用_电平转换电路原理作为一名电子设计的硬件工程师,电平转换是每个人都必须面对的的话题,主芯片引脚使用的1.2V、1.8V、3.3V等,连接外部接口芯片使用的1.8V、3.3V、5V等,由于电平不匹配就必须进行电平转换。每个工程师都有自己的一套转换方案,今天我们将5种电平转换的方法进行汇总,并且总结各种的优劣势,避免设计过程踩坑。一、电平转换方法5种电平转换方法分别是:晶体管电平转换方法;专用电平转换芯片;限流电阻电平转换方法;电阻分压电平转换方法;二极管电平转换方法;下面我们会从速率、驱动能力、漏电流、成本

    2022年8月10日
    6
  • Nginx-使用以及几种负载均衡算法

    Nginx-使用以及几种负载均衡算法文章目录Nginx(enginex)Nginx能做什么?1.正向代理2.反向代理3.HTTP服务器(动静分离等)4.负载均衡负载均衡模块-upstreamupstream负载均衡算法:轮询(roundrobin)加权轮询(WeightedRoundRobin)IP_Hashfair(第三方)url_hash(第三方)Nginx配置文件Nginxlocation匹配规则Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3

    2022年10月9日
    0
  • 史上最全安装Maven教程「建议收藏」

    史上最全安装Maven教程「建议收藏」史上最全安装Maven教程简单了解一下什么是Maven1.Maven翻译为“专家“,”内行”的意思,是著名Apache公司下基于Java开发的开源项目。2.Maven项目对象模型(POM)是一个项目管理工具软件,可以通过简短的中央信息描述来管理项目的搭建,报告和文档等步骤。3.Maven是一个项目管理的工具,可以对项目进行构建、依赖的管理。PS:(Gradle的项目搭建方式,将在不久的未来取代Maven,大势所趋。原因如何?小Du下期为您揭晓)一.官网下载下载官网→_→传送门二.配

    2022年6月4日
    29
  • 微信自动添加好友软件打包下载

    微信自动添加好友软件打包下载

    2021年9月17日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号