高并发秒杀系统

六种手段:

1.页面静态化

商品秒杀页面做静态化处理,常规请求不会到服务端。

2.cdn内容分发

将前端资源缓存到cdn上,就近分发给不同区域的客户端;

秒杀开始后将新的js文件同步到cdn上;

前端加一个控制器,控制同一用户短时间内的请求次数;

3.缓存

用多个缓存节点来抗住请求压力;

缓存击穿:事先做好缓存预热;加分布式锁,避免同一id的商品秒杀请求短时间内都进入到数据库内;

缓存穿透:加布隆过滤器过滤无效请求,但是要保证布隆过滤器的数据与缓存数据一致,只适合缓存读多写少的情形,可以把不存在的商品id也缓存起来;

4.mq异步队列

消息丢失问题:

通过消息发送表来记录消息发送情况,每隔一段时间通过job来重新发送消息。

消息重复问题:

通过维护消息处理表来规避重复消息。

消费延迟问题:

 延迟队列:延迟队列是一种特殊类型的队列,它允许消息在指定的时间点被消费。例如,用户下单后,系统可能需要等待一段时间来检查订单的支付状态,如果未支付则关闭订单。

5.限流

同一ip地址限流

同一用户限流

6.分布式锁

        分布式锁的过期时间:设置过期时间,即使在锁的持有者出现异常或者忘记释放锁的情况下,锁也会在到达预设的过期时间后自动释放,这样其他线程或进程就有机会获取到锁,继续执行任务。

        redis setnx命令加锁,但是加锁和设置过期时间不是原子的,可能会导致锁的过期时间设置失败,造成死锁等问题。

        redis set命令加锁可以保证原子性加锁和设置过期时间:使用SET命令将一个键值对写入Redis,其中键表示锁的名称,值表示锁的持有者(通常是线程或进程的唯一标识)。同时,设置一个过期时间,以防止锁一直被持有而无法释放。

SET lock_key lock_value NX PX expire_time

其中,lock_key是锁的名称,lock_value是锁的持有者(这里一般为request_id,保证在释放锁时不会释放错),NX表示只有当键不存在时才进行设置,PX表示设置键的过期时间,expire_time是过期时间(单位为毫秒)。

        

问题:

库存超卖:

数据库扣减库存:

        通过加锁来保证数据库读库存和更新库存的原子性,但是对性能有影响,可以用数据库乐观锁来提高性能:UPDATE product SET stock = stock - 2, version = version + 1 WHERE product_id = 1 AND version = 1;(乐观锁:在读取数据时并不加锁,而是在数据更新时检查在此期间是否有其他事务对数据进行了修改)。

缓存扣减库存:

        缓存库存,减少mysql压力,redis的incr方法是原子性的,可以通过该方法来扣减库存。(incr用来更新数据,只能保证原子写,想要保证原子读写,可以通过加锁的方式来实现,同样的性能会有损耗)

        通过lua脚本来修改库存,lua脚本本身保证原子性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

看看《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制山鸢尾萼片长度和萼片宽度的小提琴图

使用MATLAB绘制鸢尾花数据集( fisheriris)中山鸢尾( Iris Setosa)的萼片长度和 萼片宽度的小提琴图。这将帮助我们更好地了解山鸢尾的这两个特征的数据分布情况,包括它们的 中位数、四分位范围及密度估计。这种可视化工…

老杜spring6自己笔记

精讲 【Spring视频零基础入门到高级,spring全套视频教程详解】 https://www.bilibili.com/video/BV1Ft4y1g7Fb/?p12&share_sourcecopy_web&vd_source833390c85450e4ff7747a5f16c02cc1e 老杜spring6网盘资料: 链接:https://pan.bai…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

CF938Div3(A-F)

A: 买n个酸奶&#xff0c;一次一瓶a元,一次买两瓶可以优惠价b元,也可以a元,问恰好买n瓶需要多少钱. void solve() {int n, a, b;cin >> n >> a >> b;int ans min(a * n, n / 2 * b n % 2 * a);cout << ans << endl; } B: 给你一个数组,问能…

pdfjs-4.0.379-dist直接打开viewer.html报错

下载了pdfjs-4.0.379-dist&#xff0c;但是直接打开viewer.html报错。解决方法&#xff1a;安装live Sever&#xff0c;并用live Server打开 打开浏览器截图 错误提示如下&#xff1a; Access to image at file:///D:/work/web-common/car-knowledge-base-web/static/pdfjs-4…

OJ 栓奶牛【C】【Python】【二分算法】

题目 算法思路 要求的距离在最近木桩与最远木桩相隔距离到零之间&#xff0c;所以是二分法 先取一个中间值&#xff0c;看按照这个中间值可以栓多少奶牛&#xff0c;再与输入奶牛数比较&#xff0c;如果大于等于&#xff0c;则增大距离&#xff0c;注意这里等于也是增大距离…

AcWing1262.鱼塘钓鱼

【题目链接】1262. 鱼塘钓鱼 - AcWing题库 输入样例&#xff1a; 5 10 14 20 16 9 2 4 6 5 3 3 5 4 4 14输出样例&#xff1a; 76 【代码及详细注释】 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N110; int a[N],b[N],sp[N],d[N]…

Unity Pro 2019 for Mac:专业级游戏引擎,助力创意无限延伸!

Unity Pro 2019是一款功能强大的游戏开发引擎&#xff0c;其特点主要体现在以下几个方面&#xff1a; 强大的渲染技术&#xff1a;Unity Pro 2019采用了新的渲染技术&#xff0c;包括脚本化渲染流水线&#xff0c;能够轻松自定义渲染管线&#xff0c;通过C#代码和材料材质&…

Day36:LeedCode 435. 无重叠区间 763.划分字母区间 56. 合并区间 蓝桥杯 管道

435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后&#xff0c;剩下的区间…

Python 编程 深入了解内存管理机制、深拷贝与浅拷贝

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、对象和引用、内存管理机制 Python 中的一切都是对象&#xff0c;包括数字、字符串、列表和函数等。为了简化内存管理并提高效率&#xff0c;Python 采用了统一的对象模型。在这个模型中&#xff0c…

c++——sort()函数

一、代码和效果 #include<bits/stdc.h> using namespace std;int main() {int a[6]{1,45,2,5,456,7};sort(a,a6);for(int i0; i<6; i){cout<<a[i]<<" "<<endl;}return 0; } 二、sort函数解析 &#xff08;从小到大&#xff09; std::so…

【C++】lambda表达式

目录 一、lambda表达式1.1 C98中的例子1.2 lambda表达式语法1.3 函数对象与lambda表达式 一、lambda表达式 1.1 C98中的例子 如果要对一个数据集合进行排序&#xff0c;可以使用sort函数&#xff1a; int main() {int array[] { 4,1,8,5,3,7,0,9,2,6 };// 默认按照小于比较…

15.leetcode---逆波兰表达式求值(Java版)

题目链接: https://leetcode.cn/problems/8Zf90G/description/ 题解: 栈 代码: 测试

并发编程——5.JMM、可见性和有序性及volatile的底层实现原理

这篇文章我们来讲一下JMM和其相关的内容。 目录 1.JMM模型的介绍 2.volatile的底层原理 3.有序性的介绍 3.1as-if-serial原则 3.2happen-before原则 4.内存屏障 5.小结 1.JMM模型的介绍 首先&#xff0c;我们来看一下JMM模型。 这是一张多核CPU的并发缓存架构图。我们…

CloudCompare——win11配置CloudComPy

CloudComPy配置 1 基本环境介绍2 安装Anaconda2.1 下载anaconda2.2 安装anaconda2.3 配置镜像源2.4 更改虚拟环境的默认创建位置2.5 其他问题2.5.1 激活自己创建的环境提示&#xff1a;系统找不到指定的路径2.5.2 InvalidVersionSpecError: Invalid version spec: 2.72.5.3 卸载…

JS-27-操作表单

用JavaScript操作表单和操作DOM是类似的&#xff0c;因为表单本身也是DOM树。 不过表单的输入框、下拉框等可以接收用户输入&#xff0c;所以用JavaScript来操作表单&#xff0c;可以获得用户输入的内容&#xff0c;或者对一个输入框设置新的内容。 一、HTML表单的输入控件 H…

Capture One 23 Enterprise for Mac中文版 全面的图像处理工具

Capture One 23 Enterprise for Mac中文版一款专业的图像编辑和管理软件&#xff0c;具备强大的功能和工具&#xff0c;适用于摄影师、摄影工作室和专业用户。 软件下载&#xff1a;Capture One 23 Enterprise for Mac中文版下载 该软件为用户提供了全面的图像处理工具&#xf…

fastapi的安装

使用pip安装 安装fastapi的语句 pip install fastapi 可以使用国内阿里云镜像源进行安装&#xff0c;会快很多 pip install fastapi -i https://mirrors.aliyun.com/pypi/simple api启动依赖于uvicorn&#xff0c;还需要安装uvicorn pip install uvicorn -i https://mirr…

Spring之AOP的详细讲解

目录 一.SpringAOP是什么&#xff1f; 1.1理论知识点 1.2简单的AOP例子 二.SpringAOP的核心概念 2.1切点(Pointcut) 2.2通知&#xff08;Advice&#xff09; 2.3切⾯(Aspect) 2.4通知类型 2.5切⾯优先级 Order 2.6切点表达式 2.6.1 execution表达式 2.6.2annotati…

PHP 伪协议:使用 php://input 访问原始 POST 数据

文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议&#xff1f; php://input为什么需要 php://input&#xff1f;更灵活的数据处理减小性能压力 发送 POST 数据HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 基操 enable_post_data_…