秒杀业务的基础点

秒杀的是一个很常见的业务了。就是在某个时刻,让大量用户抢购少量的优惠的商品,从而达到商品曝光和电商网站的曝光,增大用户流量,从而提升整体销售额。

比如今年疫情下,各大电商网站,就针对口罩开展了秒杀业务。

通用秒杀逻辑

1、秒杀页动态获取服务器时间,前端根据时间倒计时
2、倒计时结束,开始秒杀
3、获取后端秒杀接口
4、真正执行秒杀(减库存,下订单insert)
一般减库存是放在redis中顶的,因为秒杀那一刻,会有大量请求过来。

下单秒杀

说说之前的一种秒杀场景,就是下单秒杀。
就是每个人都可以下单,只有你下单成功了,然后减库存成功了,才算秒杀成功。
这种秒杀,相对上面那种,会比较重一些,比较难一点。
这种情况,就必不可少的会用数据库。
做的复杂点,是将所有的操作先在nosql中保存起来,或者发出一个mq消息,然后让数据库慢慢消化,但这样就可能会出现不一致的问题。
所以,如果用户量不是特别大,也可以直接考虑用数据库顶。
如果用数据库顶,也要考虑,比如先下单,再减库存好,还是先减库存,再下单好。
直接说结果,那就是先下单,再减库存比较好。

以 MySQL 作为 DB 为例,下订单就是 insert,在使用索引的情况下,insert 插入是行级锁,支持每秒 4W 的并发。减库存就是 update 操作,命中索引时也是行级锁,但是这是个独占锁,所有的操作都要等待前一个释放锁后才能继续 update。

问题就在这里,根据 MySQL 两段锁协议,我们应该把热点操作放到离 commit 近的位置,这样可以减少行级锁的持有时间!自然处理效率就更好一些。

购买资格秒杀

比如京东的那个卖口罩的秒杀,秒杀成功只是代表你获得了购买的资格,然后你跳到结算页,就可以购买成功了,而没有获取秒杀资格的人,短时间也可以跳到结算页,最终会购买失败。如果库存减完了,页面直接置灰,显示秒杀结束。

那这个实现方式,相比秒杀完还要下单的场景,就简单多了,redis搞一个原子计数器,设置好库存,秒杀成功减库存,同时记录秒杀成功的用户。后面只有这些记录的用户才可以购买。

mysql

如果你是一个小的商城服务,成本有限,没有时间和钱去维护那么多nosql,mq等高可用服务,实在没办法了就直接用mysql先抗吧,毕竟小商城,既要有秒杀这种活动,又不想多花钱,但好在用户量也不大,所以用mysql,我觉得用的好的话,也能抗住不少。

比如可以写存储过程,将insert和update放在一个存储过程中,这样的好处是可以减少java客户端与mysql的执行次数,最终是减少了事务锁的时间。
但存储过程,我并没有在真正的生产环境见过这样用的,甚至一些大并发的部门,都是禁止用存储过程的,所以这个用存储过程,也只是一种民间说法,可以作为一个思考方向吧。

缓存

cdn缓存

一般秒杀页的静态资源,包括一些基本不变的css,js都可以静态化处理推送在cdn缓存上。

redis缓存

redis缓存,为了挡住大部分到数据库的请求。
缓存和数据库的一致性考虑,需根据业务不同自行判断。
对于几乎不可改的数据,可以用redis的过期时间,过期了就再从数据库查一次。
对于常改的数据,就需要每次改完数据库都同步一下redis了。
普通业务,只要产品经理靠谱点,都会搞成不可改的数据,如果错了就废弃掉,新建一条。

序列化

redis由于不能存对象,一般可以存json,或者byte数组。
一般使用java原生的序列化也行,就存byte数组,或者糙一点,存json字符串也有,但讲究点的,可以选择换种序列化方式。
这里个人推荐用protobuf序列化。
protostuff序列化包,使用protobuf序列化协议,相比java原生的序列化,速度快,占用空间还小。
为什么又快又小,可参考:https://github.com/eishay/jvm-serializers/wiki

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随想,产品思维和开发思维

有时候,产品思维和开发思维,由于出发点的不同,会产生较大的分歧。 作为一个开发,不仅要有自己的思维,也要了解产品的思维,这样才能在和产品的撕逼的战斗中所向披靡,百战百胜。 举个例子&#x…

Base64编码的原理与常用实现

这篇主要是为了后面好介绍加密算法,做的铺垫。 这个是基础,什么是一个程序员的涵养,这些基础就是涵养。 平时可能用不到,但必须得会。 如果连这个原理都说不上来,就别玩王者荣耀绝地求生英雄联盟和平精英了&#xff0c…

MD5算法原理与常用实现

目录定义MD5特点常见应用场景1、校验文件的完整性2、存储用户密码原理1、填补信息2、拿到初始值3、真正的计算MD5为什么不可逆java实现和使用定义 MD全称Message-Digest,即信息摘要,所以MD家族的算法也叫信息摘要算法 MD家族有MD2、MD3、MD4、MD5&#…

SHA算法原理与常用实现

看本文前,最好先看看之前的这一篇关于MD5算法的介绍。 MD5算法原理与常用实现 本文目录定义MD5和SHA-1的碰撞问题常见应用场景1、类似MD5的应用场景2、比特币3、https签名算法会用到SHA-256算法原理1、填补信息2、拿到初始值3、真正的计算java实现和使用定义 SHA算…

MAC算法原理与常用实现

看本文前,最好先看看之前的对于MD5算法和SHA算法的介绍。 本文目录定义常见应用场景1、linux客户端:SecureCRT2、Google身份验证器3、银联pos机终端原理java实现和使用定义 MAC(Message Authentication Codes),是一种…

对称加密算法原理与常用实现

目录定义常用对称加密算法DES3DESAESPEB常用对称加密算法的java实现DES实现3DES实现AES实现PEB实现定义 原文通过加密秘钥生成密文,密文通过解密秘钥得到原文。 对于加密秘钥和解密秘钥是相同的算法,就叫对称加密算法。 常用对称加密算法 DES Data E…

面试 HTTP ,99% 的面试官都爱问这些问题

HTTP 和 HTTPS 的区别HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范HTTP 主要内容分为三部分,超文本(Hypertext)、传输…

非对称加密算法 --- RSA签名算法

目录RSA原理RSA应用场景RSA加密场景RSA签名场景RSA加解密和签名算法的java实现RSA原理 通过一定的规则,生成公钥和私钥,公钥和私钥总是成对出现。 公钥可以公开出去,任何人都可以知道。 私钥只有自己知道。 RSA算法能保证,公钥加…

@JsonFormat失效解决

先说结论 JsonFormat失效,换成JSONField就好了 问题经过和原理 JsonFormat作为Date类型的属性值,返回前端格式化处理,很方便。 比如: JsonFormat(pattern "yyyy/MM/dd HH:mm:ss")private Date updateTime;返回给前端…

如何在摆摊经济中脱颖而出

最近,摆摊经济开始火了起来,于是各路诸侯纷纷举起大旗开始摆摊。我周围也不乏有亲朋好友蠢蠢欲动,有的甚至已经初有规模。但这波摆摊风是否真的可行,对谁可行,有哪些风口,有哪些坑,我们慢慢分析…

java 实现 生成短链接服务

java实现短链接转换服务 类似上图这种短信,对应的就是一个短链接。 看到原理也不难,于是先写个最简易版的玩玩,以后有需求了再补充吧 下面是一个简易版的短链接生成代码 搭个spring-boot服务,复制这两个controller,就…

[转载] --- Fastjson1.2.68版及以下全版本远程代码执行漏洞通告

再这样&#xff0c;真的要放弃fastjson了 【安全通告】Fastjson <1.2.68全版本远程代码执行漏洞通告 尊敬的腾讯云用户&#xff0c;您好&#xff01;近日&#xff0c;腾讯云安全运营中心监测到&#xff0c;Fastjson <1.2.68版本存在远程代码执行漏洞&#xff0c;漏洞被利…

[记录] --- safari浏览器对于yyyy-MM的坑

问题 后端给前端返回的带格式的日期类型时&#xff0c;很多时候都是yyyy-MM-dd格式的&#xff0c;在一般浏览器中都没问题&#xff0c;但safari浏览器就会出问题。 解决&#xff1a; 换成yyyy/MM/dd格式

数据库选型经验汇总

数据库选型 下面这些都是免费开源的。 暂且不考虑数据量&#xff0c;大致的选型方案。 一般分析型数据库&#xff0c;都是可以支持GB到TB级别。 上面的分类都不是一定的&#xff0c;只是大体上的推荐。具体还得结合实际场景调整。 数据处理大致可以分成两大类&#xff1a; 联…

excel导出经验

excel导出经验&#xff0c;供参考 数据量&#xff1a;1万以下 直接导出&#xff0c;正常在5秒内 数据量&#xff1a;1万-10万 直接导出&#xff0c;正常在10秒内 数据量&#xff1a;超过10万&#xff0c;建议多文件导出。 可使用多线程查询&#xff0c;比如一个线程查1万…

LeetCode删除排序数组中的重复项(Java实现)

原题&#xff1a; 给定一个排序数组&#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: …

关于高考报志愿的一些规划建议

目录前言1、报志愿&#xff0c;选大学中国大学的档次报志愿的整体思路不同分数线的报志愿建议超出一本分数线100分以上超过一本分数线50分左右到100分刚刚超过一本分数线不到50分二本分数线超很多&#xff0c;但刚好没上一本分数线刚上二本分数线的三本分数线专科分数线选择大学…

RabbitMQ和Kafka选型用哪个

作为一个有丰富经验的微服务系统架构师&#xff0c;经常有人问我&#xff0c;“应该选择RabbitMQ还是Kafka&#xff1f;” 基于某些原因&#xff0c; 许多开发者会把这两种技术当做等价的来看待。的确&#xff0c;在一些案例场景下选择RabbitMQ还是Kafka没什么差别&#xff0c…

spring boot controller 增加指定前缀的两种方法

1、增加配置 server.servlet.context-path: /api 这种是最常见的&#xff0c;加上这个配置后&#xff0c;所有的url&#xff0c;必须带上/api的前缀&#xff0c;才能访问到该url 2、过滤拦截 这种是加上/api也可以访问&#xff0c;不加/api也可以访问&#xff0c;适合项目重…

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…