黑马点评09 秒杀功能总结

 1.整体业务流程

1.1 redis判断流程 (单线程)

1.首先获取订单id和用户id,调用lua脚本进行redis操作,lua内包括 对购买资格/库存充足的判断 、 扣库存下单、发送订单消息到Stream。

2.Stream组成消息队列,有异常自动放到pending-list

1.2线程流程 (多个线程轮流)

1.线程读取消息队列(read消息队列),如果能不能读到消息,就继续读;如果读到了订单消息,就解析消息内容,调用下单函数3写入数据库,然后回复确认ack;如果出现了异常,就去处理penging-list 步骤2。

2.处理penging-list,解析消息,下单,处理;如有异常,重复循环继续处理;直到处理完跳出。

3. 加Redisson分布式锁,调用创建订单数据库操作。

2.解决了哪些问题?

2.1.超卖问题-->乐观锁

通过乐观锁,用库存当做版本号,只要库存大于0,就可以允许下单(一人一单后面有措施解决)

在lua脚本内代码

2.2一人一单->维护set,存储用户id+优惠券id,判重

sismember去判断用户id和优惠券id的记录是否同时存在在集合内

集合结构保证即便用户数量很多,也能最大程度减少重复数量,同时存在判断效率也高

 

2.3避免lua脚本频繁读取

定义成静态资源,随时取用,不用反复读lua脚本

 

2.3为什么分布式锁Redisson

分布式锁能够保证在集群模式下,不同的服务器jvm上保持锁的唯一性

后续Redisson使用了hash结构,因为能够保证可重入性

Redisson内部自动解决了2.4和2.5的问题。

 

2.4(自实现的才有这问题)分布式锁的宕机死锁-->设置过期时间+保证原子性lua脚本

过期时间保证服务宕机之后锁会过期释放

lua脚本保证不会锁还没加过期时间就宕机

Redisson内部自动实现了过期时间和加锁的原子性操作(lua),所以不会分开执行,不会死锁。

 

2.5(自实现的才有这问题)分布式锁的多线程误删问题-->判断线程标识+保证原子性lua脚本

判断锁的唯一线程标识,不是自己的不删

lua保证原子性,避免id判断和删锁之间的间隙

Redisson有看门狗机制,自动给锁续期,所以不存在锁过期导致别的线程获取锁然后误删的问题。只有服务宕机之后,看门狗机制也停止,才会锁过期,但这不是误删问题(服务阻塞但没有宕机)。

 2.6 Redisson可重入、可重试、自动续期

可重入:锁底层是hash结构,hash的名字是,hash的key(field)是线程名字,value是重入次数。

多获取一次锁次数加一,结束一次次数减一,只有次数为0线程才会释放锁。

可重试:发布订阅。订阅锁的消息,一旦其他线程释放了锁,就会发布一个消息通知别人来抢。有一个剩余重试时间waitTime,所有抢锁时间加起来如果超过这个阈值,就会放弃重试,如果还有剩余重试时间,就继续等发布然后抢,等发布的时间就是当前剩余重试时间。如果等不到,就不等了。

 自动续期:看门狗,一个函数重置重试时间(默认30s),每次都从30s开始。然后递归,实现无线续期。

3.一些数据结构

3.1 redis里

3.1.1 用于一人一单的set

使用redis的set结构,包含订单id和用户id

redis.call('sismember', orderKey, userId) == 1)

3.1.2 消息队列 Stream

--3.5 发送消息到redis stream队列,xadd stream.orders * k1 v1 k2 v2......
redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)

3.1.3库存Stock 用String计数

redis.call('get', stockKey)) <= 0)

3.2 mysql里

3.2.1 完整订单

持久化进来的订单

3.2.2优惠券和秒杀优惠券

优惠券数据

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

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

相关文章

Zabbix自动发现并注册已安装agent的主机

先在被监控主机上安装好zabbix-agent 然后登录zabbix网页 点击发现动作后会出现第三步 然后编辑操作&#xff0c;发现后加入到主机组群 然后编辑发现规则 然后就可以在主机列表中看到被发现的主机。

内皮素-1(Endothelin-1 )ELISA kit

灵敏、快速的内皮素-1 ELISA试剂盒&#xff0c;适用于心血管和应激相关研究 内皮素&#xff08;Endothelin, ET&#xff09;是由血管内皮细胞产生的异肽&#xff0c;具有强大的血管收缩活性。这种肽由三个独立的基因编码&#xff0c;经过加工产生39个残基的 大ET 分子&#xff…

Spring AOP入门指南:轻松掌握面向切面编程的基础知识

面向切面编程 1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给…

【每日一题】得到山形数组的最少删除次数

文章目录 Tag题目来源解题思路方法一&#xff1a;最长递增子序列 写在最后 Tag 【最长递增子序列】【数组】【2023-12-22】 题目来源 1671. 得到山形数组的最少删除次数 解题思路 方法一&#xff1a;最长递增子序列 前后缀分解 根据前后缀思想&#xff0c;以 nums[i] 为山…

windos/ubuntu20.4下UE4.27.2像素流送

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

使用PJL 开发一个文档打印多份copies的打印顺序参数是啥?

现在需要一个文档一份打印完成后再打印另一份的参数&#xff1b;功能同Window的“逐份打印”功能

JavaOOP篇----第十一篇

系列文章目录 文章目录 系列文章目录前言一、Static关键字有什么作用?二、final在java中的作用,有哪些用法?三、StringString StringBuffffer 和 StringBuilder 的区别是什么?四、String str=”aaa”,与String str=new String(“aaa”)一样吗?前言 前些天发现了一个巨牛的…

现代雷达车载应用——第3章 MIMO雷达技术 3.2节 汽车MIMO雷达波形正交策略

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.2 汽车MIMO雷达波形正交策略 基于MIMO雷达技术的汽车雷达虚拟阵列合成依赖于不同天线发射信号的可分离性。当不同天线的发射信号正交时&#x…

LangChain入门指南:定义、功能和工作原理

LangChain入门指南&#xff1a;定义、功能和工作原理 引言LangChain是什么&#xff1f;LangChain的核心功能LangChain的工作原理LangChain实际应用案例如何开始使用LangChain 引言 在人工智能的浪潮中&#xff0c;语言模型已成为推动技术革新的重要力量。从简单的文本生成到复…

PMP证书的PDU如何获得?

首先&#xff0c;让我们来了解一下PDU的含义。PDU代表专业发展单元&#xff08;Professional Development Unit&#xff09;&#xff0c;是指在获得认证后&#xff0c;您可以通过学习、授课或提供志愿服务来积累专业项目管理领域的学习时间。PDU以小时为单位计算&#xff0c;每…

柔性屏的性能、使用、维护

柔性屏是一种新型的显示技术&#xff0c;相比传统刚性屏幕&#xff0c;具有许多独特的优势。以下是关于柔性屏的性能、使用和维护的详细介绍&#xff1a; 一、性能 弯曲性&#xff1a;柔性屏幕可以轻松弯曲、卷曲或弯折&#xff0c;适应不同的表面形状&#xff0c;如弧形墙面、…

猜数字游戏 C语言xdoj490

问题描述 猜数字游戏是令游戏机随机产生一个 100 以内的正整数&#xff0c;用户输入一个数对其进行猜测&#xff0c;需要你编写程序自动对其与随机产生的被猜数进行比较&#xff0c;并提示大了&#xff08;“Too big”&#xff09;&#xff0c;还是小了&#xff08;“Too smal…