这个秒杀一人一单怎么样,Ai加个人总结的。想用于面试吟唱

#牛客AI配图神器#但是被发现没有完整实现怎么办?大家 帮我看看。实现秒杀以及一人一单的策略:

1:Redis层面的分布式锁
首先将分布式锁的粒度降低,将用户Id与商品Id进行绑定,借助LUA脚本(原子性),先判断是否存在购买标识(幂等性1),没买过就去尝试获取分布式锁,获取成功之后
然后再次判断是否存在购买标识,再判断库存是否足够,最后再扣减库存,两次判断减少锁竞争的消耗

2:数据库层面的数据修改
第一种:开启事务,对数据库的数据进行修改,扣减库存以及添加用户的购买记录,然后在Redis中添加唯一标识
可以借助Set进行存储,也可以借助string进行存储。
string结构可以实现更加精准的存储,可以存储相关的任务状态,比如已完成,未完成,完成中,同时还可以对过期时间进行单独指定,但是呢,当海量数据下会造成高频的内存碎片,与集群跨槽访问开销
Set结构可以以更加高效的查询效率去实现检索判断,约为string的30%,但是呢,无法存储任务状态,存在大Key问题,以及对过期时间只能全局Set的设定无法单个元素的设定。

第二种:RabbitMQ提高并发能力(幂等性,可靠性的保证)
如果说需要想提高并发能力,可以借助RabbitMQ去异步将数据同步数据库,只在Redis去执行业务的决策,此时RabbitMQ当中只是去对数据进行修改,可以保证最终的一致性,无法保证全局的一致性。
1 保证幂等性2,将用户id与商品id创建唯一索引或者唯一约束,避免重复消费添加,添加失败导致事务回退
2 保证幂等性3,创建全局唯一Id,可以在Redis业务决策结束后生成,后续与用户id商品id一起传入RabbitMQ,当消息被消费者正常消费后,将唯一id存储到Set当中,消费者消费前对判断Set当中是否存在这个唯一标识id,存在代表以及消费过不存在则未消费过或者将这唯一id借助string类型进行存储,消费者消费前判断string是否可以获取成功,成功则代表已经消费过,不成功则未消费

3:定时任务进行校验
最后还可以借助xxl-job对Redis数据与数据库数据进行校验

改进:
1 Redis 持久化与高可用: 需要配置 RDB+AOF 和 Redis Sentinel/Cluster 防止数据丢失和服务中断。
2 冷启动/预热: 秒杀开始前,需要将商品库存和必要信息加载到 Redis。#我的AI电子员工##你最近一次加班是什么时候?##牛客创作赏金赛#
全部评论
接好运
点赞 回复 分享
发布于 08-13 21:41 安徽

相关推荐

09-10 20:58
已编辑
北京师范大学 算法工程师
啊啊啊!!不愧是字节 拷打的汗流浃背,最后算法题没为难 力扣hot100原题许愿许愿啊啊啊拷打项目&八股!(都是根据项目问的八股额啊啊啊):项目难点啊,轻耦合表现在哪啊,java的哪些特性实现了轻耦合啊,模块与模块之间怎么实现的轻耦合啊……spring依赖注入方案有哪些?Setter和基于接口的方案有啥区别?你用哪个?为什么?柔性事务相对刚性事务有什么区别?中间状态不一致为什么保持了强一致?tcp半包粘包?tcp报文段有规定体积吗?头部有规定体积吗?设计编码器是怎么解决半包粘包的?怎么判断这个包是不是属于这个包的开头部分……tcp重复和丢包是怎么处理的?怎么保证收到的是完整的?(长度和内容)udp实现IM的话应用层怎么保证安全和一致性呢?(重传部分问的很细((java集合的ArrayList和LinkedList有什么区别?内存部分有什么特点?应用场景有?Hashmap底层怎么实现的?什么时候扩展到红黑树?有什么优势?红黑树怎么保证平衡?场景题:用户同时保存下载100本小说,有进度提示,希望下载的越快越好,也希望保障手机的性能,可以从哪些点入手来实现?这样的item结构是啥样的?怎么更新下载状态?存到本地数据库要注意什么?为什么造成死锁?怎么解决?怎么设计锁?网络层层面怎么进行优化?……算法:删除链表的倒数第n个节点攒点人品希望至少能过一面
查看23道真题和解析
点赞 评论 收藏
分享
评论
2
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务