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

基于秒杀系统的企业开发设计思考

一、需求分析

需求描述为实现某商品秒杀活动,结果为商品库存为0,订单数量和商品原有库存数量,即保障系统数据一致性同时,保障系统稳定性

二、流程设计

三、数据库设计

本次示例仅涉及商品表、订单表,这里分析数据库设计原则

1、第一范式 即每个列遵循原子性 举例:人的多个属性不能都放在一列

2、第二范式 即每个表遵循模块化 举例:订单模块和产品模块分开,即同一张表只能依赖一个主键(或负荷主键)

3、第三范式 即每个列遵循冗余性 举例:单价和总价不应该同时出现,班级和老师不应该同时出现

总结:需求>性能>范式,为了性能/需求,该冗余还是得冗余;为了成本,至少遵循第三范式

四、缓存设计

key设计规范

以业务名为前缀(防止key冲突),用冒号分隔,比如业务名:模块名:id

五、设计方案对比

方案一

利用数据库完成秒杀系统,其中查询/更新库存,需结合数据库事务和排他锁进行实现

方案二

利用数据库和redis完成秒杀系统,其中查询/扣减库存,结合分布式锁和redis原子性递减操作实现

方案三

利用数据库和redis完成秒杀系统,其中查询/扣减库存,利用redis lua操作实现

六、压测工具及数据分享

1.压测工具ab

常用参数

-k Use HTTP KeepAlive feature

-t timelimit Seconds to max. to spend on benchmarking

-n requests Number of requests to perform

-c concurrency Number of multiple requests to make at a time

2.压测环境

压测环境:cpu:2核 内存:2G(注:不包括中间件带来的资源消耗)

执行命令:ab -k -c 100 -t 10 http://localhost:8089/seckill-service/doSeckill?productId=1

3.压测数据

方案一

Requests per second: 716.40 [#/sec] (mean)

Time per request: 139.587 [ms] (mean)

方案二

Requests per second: 827.66 [#/sec] (mean)

Time per request: 120.822 [ms] (mean)

方案三

Requests per second: 2955.46 [#/sec] (mean)

Time per request: 33.836 [ms] (mean)

七、mysql锁和redis常见问题分享

mysql锁-----行锁的类型

1、共享锁(Shared Lock):也叫 S锁/读锁,允许多个事务同时读取同一资源

2、排它锁(Exclusive Lock):也叫 X锁/写锁,只允许一个事务对资源进行写操作

redis常见问题

1、缓存穿透即查询一个不存在的数据,即缓存和数据库都不存在

解决方案:布隆过滤器(借助redisson的bloomFilter),存放所有key,不存在直接拦截

注:bloomFilter.tryInit参数为元素空间大小、误判率 ,其中误判率越低,占用空间越大  

2、缓存击穿即某个热点数据失效,导致数据库压力剧增,即缓存不存在,数据库存在

解决方案:a.对热点数据的数据库操作加锁(借助redisson的lock) b.热点数据不过期

3、缓存雪崩即所有缓存数据同时失效,即缓存不存在,数据库可能存在/可能不存在

解决方案:a.失效时间随机值 b.缓存分布式

八、源码分享

seckill-service: 秒杀系统示例

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LFU算法实现笔记
  • 【postgresql】pg_dump备份数据库
  • 六爻排盘 api数据接口
  • mmc-utils 的 MMC 测试工具
  • nng协议nni_posix_resolv_sysinit()系统初始化
  • iOS ------ ARC的工作原理
  • Android获取当前屏幕显示的是哪个activity
  • 访问控制系列
  • 【RPC注册发现框架实战】一个简易的RPC注册发现框架
  • Vue.js:如何区分页面关闭和刷新?深入解析与实战
  • mysql命令练习
  • 测试开发面经总结(三)
  • Qt篇——QSqlQueryModel内容居中显示
  • Stable Diffusion:质量高画风清新细节丰富的二次元大模型二次元插图
  • 服务器的80和443端口关闭也能申请SSL证书
  • 【技术性】Search知识
  • angular组件开发
  • es6要点
  • Netty 4.1 源代码学习:线程模型
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Next.js之基础概念(二)
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • vue-cli3搭建项目
  • 从setTimeout-setInterval看JS线程
  • 讲清楚之javascript作用域
  • 今年的LC3大会没了?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • -- 数据结构 顺序表 --Java
  • 算法---两个栈实现一个队列
  • 微信小程序设置上一页数据
  • 用Python写一份独特的元宵节祝福
  • 在Mac OS X上安装 Ruby运行环境
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • # 数仓建模:如何构建主题宽表模型?
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (C++20) consteval立即函数
  • (CPU/GPU)粒子继承贴图颜色发射
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六)激光线扫描-三维重建
  • **PHP二维数组遍历时同时赋值
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • . NET自动找可写目录
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 验证控件和javaScript的冲突问题
  • .net中调用windows performance记录性能信息
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @staticmethod和@classmethod的作用与区别
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布