商城秒杀功能总结
秒杀系统的场景特点高并发、请求数量远远大于库存数量、下订单减库存。秒杀架构设计理念限流、削峰、异步处理、缓存、可拓展。实现方案限流、采用消息队列缓存、利用缓存应对读写请求。使用技术前端小程序后端Spring Cloud、Mybatis中间件RabbitMQ、Redis关键技术1、无状态登录实现分布式session好处不依赖于服务端信息用户信息只存在于user模块、减小服务端存储压力、服务端可以任意迁移伸缩。流程登录时对用户信息进行认证-认证通过后将用户信息加密形成token返回客户端-每次请求都携带该token-服务对token进行解密。技术实现JWTRSA非对称加密JWTJson Web Token是JSON风格轻量级的授权和身份认证规范。JWT包含三部分Headertoken类型最基础是JWT、加密算法Payload有效数据、SignatureRSA256(Base64(Header)Base64(Payload)私钥用于校验信息是否被篡改。RSA256非对称加密。私钥加密时持有私钥或公钥解密公钥加密持有私钥才可解密。为什么要使用RSA256如果使用非可逆加密由于安全性私钥只会存在鉴权中心因此所有请求都要访问鉴权中心导致鉴权中心压力过大。私钥只存在于鉴权模块中公钥存在于其他所有模块所有模块都可以通过公钥解析用户身份信息。2、Redis预减库存减少数据库访问内存标记减少Redis访问读取策略首先尝试从缓存读取读取到数据则直接返回如果读不到就读数据库并将数据库写回到缓存并返回。更新策略先更新数据库然后把缓存对应的数据删除防止频繁更新懒加载的思想。如果先删除缓存再更新数据库如果有A、B线程同时更新这时C线程在AB更新之间读取会把A更新的数据写入缓存导致缓存、数据库不一致如果不删除缓存A、B线程更新数据库B后更新的数据库却先更新了缓存也会导致缓存、数据库不一致。但是如果redis删除失败也会存在缓存不一致问题更好的做法是对相同的商品id做hash将对于商品的操作路由到某一个内存队列中以此来保证多线程环境下对同一条记录读写并发的问题其中可以对多个更新缓存请求合并并且设置超时时长防止频繁更新导致大量读请求积压但一般来说更新频率不会这么高。当读请求并发量很高时可以扩容。但是缺点是串行化降低系统吞吐量。3、使用消息队列完成异步下单秒杀逻辑1把商品库存加载到Redis2后端受到秒杀请求Redis预减库存如果库存不足直接返回失败3库存充足且无重复秒杀则将秒杀请求入队返回排队中4后端消费者监听秒杀消息通道在此判断库存、判断是否重复秒杀然后执行秒杀事务。5秒杀成功则返回商品ID-1秒杀失败0表示排队中。4、安全限制1秒杀接口地址隐藏秒杀请求发起之前先去获取秒杀地址-生成随机MD5字符串存入redis并设置有效期60s)-前端携带该参数进行秒杀后端验证该参数2数学公式验证码ScriptEngineManager eval生成结果存入redis3接口限流防刷使用用户ID和商品ID拼接key用key记录用户访问次数有效期1分钟并设定访问限制次数。项目细节问题解决1、为防止缓存穿透对不存在的数据缓存空数据2、秒杀开始前进行缓存预热并使用keepalived建立主从热备3、对于缓存中库存已清零采用内存标记减少redis服务器的压力4、在秒杀订单表中使用商品Id和goodsId建立唯一索引防止重复下单5、在减库存sql中增加stock_count0判断防止卖超6、设置定时任务轮询超过30分钟未支付的订单将其关闭并回复库存。压力测试使用JMeter测试5000个线程*10次优化前后QPS从1000多提升到2700多。改进方法nginx横向扩展、分布式缓存、分布式数据库。

相关新闻

大一暑假集训最终考试(一)(2019.8.31)

大一暑假集训最终考试(一)(2019.8.31)

D题 nefu 1866 这是一道难题 思路&#xff1a;树状数组模板题。还有就是树状数组的单点修改只支持加减&#xff0c;不支持直接修改&#xff08;修改时先减去原来的数&#xff0c;再加上修改后的数即可&#xff09;。 坑的地方&#xff1a;没说查询时一定满足x<y&#xff0…

2026/11/2 9:46:22 阅读更多 →
和小白一起学数据结构六之基本概念总结

和小白一起学数据结构六之基本概念总结

一起学数据结构之绪论基础概念 五天前甚至对markdown语法&#xff0c;都不是很熟悉&#xff0c;现在却觉得没有这个语法的创作页面没有灵魂哈哈。其实这个东西一年前就有人推荐给博主了&#xff0c;当时只是看一下觉得麻烦&#xff0c;没怎么走几步&#xff0c;回过头来才发现因…

2026/10/28 3:09:47 阅读更多 →
Markdown编辑器使用说明

Markdown编辑器使用说明

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

2026/10/28 5:58:36 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻