秒杀

定义

秒杀是指商家对商品在规定的时间点内进行促销活动,大量的用户在秒杀页面进行抢购

在同一时间,有大量的请求购买同一个商品,且需要完成支付!(大批量的读与写)

秒杀中使用的技术点

整体的架构需求

  1. 因为会涉及大量的并发读和并发写,所以必须支持高并发访问. 解决方案:热点的发现隔离,动静分离,请求削峰与分层过滤,服务端的极致优化
  2. 会存在超买超卖的现象,在大并发的更新中,保证数据的一致性

框架的搭建



pom.xml

<!--MybatisPlus的网址:https://baomidou.com/pages/b7dae0/#使用教程--><!--springBoot依赖--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><!--thymeleaf组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--web组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--mybatis plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter-test</artifactId><version>3.5.1</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--test组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>

yml

spring:redis:host: 192.168.56.10rabbitmq:host: 192.168.56.10
#  thymeleaf配置thymeleaf:
#    把缓存关闭cache: falsedatasource:username: rootpassword: 1234url: jdbc:mysql://localhost:3306/seckill?useSSL=true&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Driverhikari:
#      连接池名pool-name: XxhChen
#      池中维护的最小空闲连接数  默认为10minimum-idle: 4
#      连接允许在池中闲置的最长时间 默认600000idle-timeout: 120000
#      池中最大连接数,包括闲置和使用中的连接  默认为10maximum-pool-size: 10
#      自动提交从池中返回的连接  默认为trueauto-commit: true
#      池中连接最长生命周期 默认1800000max-lifetime: 1200000
#      等待来自池的连接的最大毫秒数(连接超时时间) 默认 30000connection-timeout: 60000
#      测试(驱动程序支持JDBC4,不建议设置)connection-test-query: SELECT 1application:name: seckilljackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8
#Mybatis-plus配置
mybatis-plus:
#  配置Mapper.yml的映射文件mapper-locations: classpath:/mapper/**/*.xmlglobal-config:db-config:id-type: autologic-delete-value: 1logic-not-delete-value: 0
server:port: 5599

代码整体框架

我一般使用的是git上的renren-generator,生成器会生成一些增删改查的代码,手动删除

具体教程 : https://www.cnblogs.com/youcong/p/9885148.html

用户密码二次MD5加密

第一次加密

加密地点

用户端输入完明文密码传入后端后进入MD5加密

使用原因

防止密码以明文的方式进行传输(正常用户输入的是明文密码,如果不进行加密,明文会直接在网络中进行传输,会被截获)

第二次加密

加密地点

后端接收到经过第一次加密后的密码后,存到数据库之前,再进行一次MD5加密

使用原因

防止出现数据库盗用的情况,会根据我们已经加密后的密文,以及salt,反推出我们之前的明文密码.(为了更安全)

MD5依赖

        <!--MD5依赖--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>

MD5 工具类

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class Md5Util {private static  String SALT = "98230klfjajd-02234olf;;da/'.,v09034";public static String getMD5Str(String str) {byte[] digest = null;try {MessageDigest md5 = MessageDigest.getInstance("md5");digest  = md5.digest(str.getBytes("utf-8"));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}//16是表示转换为16进制数String md5Str = new BigInteger(1, digest).toString(16);return md5Str;}//加盐加密public static String md5Salt(String s){//        明文+固定saltreturn getMD5Str(s+SALT);}//加盐加次数加密/**1       md5Salt(s); = f(1)2       md5Salt(md5Salt(s))= f(f(1))3       md5Salt(md5Salt(md5Salt(s))) = f(f(2))*/public static String md5Ci(String s,int num){//递归写法if(num ==1){return md5Salt(s);}return md5Salt(md5Ci(s,num-1));}public static void main(String[] args) {//盐String s = "123456";//加盐加密String md5Str = md5Salt(s);String md5Str2 = md5Salt(md5Str);String md5Str3 = md5Salt(md5Str2);System.out.println(md5Str3);System.out.println(md5Ci(s,3));}}

结果

秒杀中出现的问题

超卖

商品是有库存限制的,如何避免购买成功的人数小于等于库存数量

解决方案一

使用Redis的单线程预减库存,

在Redis中存储一个key,value,<key,库存数量>

当有一个用户线程进来后,库存数量-1,

当减到0的时候,拒绝剩下的请求.

解决方案二

可以使用基于Redisson的分布式锁,

他会通过lua脚本去设置值,设置时间,保证他的原子性,

因为他本身就封装了分布式锁,所以不需要我们进行操作.

但这里可能会出现的问题是,

我们设置的锁的时间是3秒,但是他实际运行了五秒钟,

Redisson本身含有watch dog(看门狗) 可以每过一段时间,进行监控,

如果未执行完毕,会加时间,确认锁定

持续更新ing

秒杀(技术点+问题)相关推荐

  1. 聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒

    聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒 作者 digoal 日期 2016-11-17 标签 PostgreSQL , 秒杀 , 裸秒 , ad lock 双十一背后的技术系列文章 &l ...

  2. 支付宝(AR虚拟现实)红包玩法与技术背景 - GIS(LBS)、图像识别与秒杀技术的完美结合...

    2019独角兽企业重金招聘Python工程师标准>>> 背景 作为搞IT的小伙伴们,对虚拟现实(AR)应该并不陌生,这次支付宝带来了一个很有趣的功能,虚拟现实与藏红包结合起来. 简单 ...

  3. 技术干货(2 of 5):电商秒杀架构分析

    在上一篇"分析与实战:微信红包体系的整理"文章中,我们对微信红包的体系结构进行了非常深入详细的剖析,并且着重讨论了微信红包在高并发环境下所面临的问题及应对的策略. 说到高并发,其实 ...

  4. 秒杀场景的业务和技术难点分析

    秒杀场景的业务和技术难点分析开始: 一.秒杀业务需求分析 1.秒杀发生的时间节点 一般都是在新品上市,促销的时候:价格低廉 2.秒杀的目的 通过发布一定数量的秒杀商品达到促进销售的目的,吸引用户关注: ...

  5. 转:秒杀系统架构分析与实战

    原文出处: 陶邦仁   欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单: ...

  6. 这是我读过写得最好的【秒杀系统架构】分析与实战!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://rrd.me/ewVWv 1 秒杀业务分析 2 ...

  7. Redis 秒杀实战

    原文链接:https://www.cnblogs.com/chenyanbin/p/13587508.html 已原创授权 为啥写这个微信抢红包项目呢,公司 0202 年 08 月 22 日,公司周年 ...

  8. 高并发下的秒杀系统架构设计实战!

    1.秒杀业务分析 正常电子商务流程 (1)查询商品: (2)创建订单: (3)扣减库存: (4)更新订单: (5)付款: (6)卖家发货: 秒杀业务的特性 (1)低廉价格: (2)大幅推广: (3)瞬 ...

  9. 秒杀系统架构分析与实战,一文带你搞懂秒杀架构!

    作者丨猿码道 jianshu.com/p/df4fbecb1a4b 1.秒杀业务分析 正常电子商务流程 (1)查询商品: (2)创建订单: (3)扣减库存: (4)更新订单: (5)付款: (6)卖家 ...

最新文章

  1. 史上最强福利,阿里云半价+Plesk免费2万台速抢!
  2. windows和ubuntu双系统设置开机默认系统
  3. 使用 vue-i18n 切换中英文
  4. webpack 编译完成执行代码
  5. Linux 匿名页的反向映射
  6. 起底方舟编译器的引用计数!
  7. win10安装nvidia驱动
  8. 国外项目跳板机访问时差问题
  9. h5聊天页面 jquery_基于Jquery WeUI的微信开发H5页面控件的经验总结(1)
  10. python aiml开发文档,带有Python的AIML文件
  11. 单片机(嵌入式)程序分层架构
  12. 照片的分辨率怎么调整?图片分辨率太低怎么调高?
  13. anti-wrinkle_Anti-wrinkle是什么意思
  14. 腾讯云自建k8s对接文件存储CFS
  15. 16福师计算机应用基础在线作业,16春季福师《计算机应用基础》在线作业二分析.doc...
  16. 华为2018优招 解决方案技术工程师
  17. Social Justice Awards秋季赛学霸怎么理解?
  18. jsp调用python脚本_jsp里引用bean
  19. 单片机用途有哪些?学会了单片机能做什么工作?
  20. Android 刷机/Root/安装Xposed

热门文章

  1. 用Matlab中Simuink仿真Lorenz混沌系统,并画出波形、图像
  2. 孟宁的Linux内核分析,Linux内核分析-MOOC小结
  3. 铁电FM25CL64读写
  4. ES优化文件系统缓存filesystem cache
  5. 《牧羊少年奇幻之旅》
  6. git教程 自学笔记
  7. 扁平化设计的前世今生
  8. 【小卜学编程】Python面试知识点梳理——一些废话以及知识点分类(一)
  9. C语言系列——第三节-函数
  10. (3) Top 6 移动广告Mediation平台Admob Mopub Appodeal