代码编织梦想

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

=====

在高并发的情况下,MySQL就显得有些力不从心了。

一方面是MySQL本身要支持事务的ACID,单机性能不高。

另一方面,MySQL是个单机数据库,本身是不能水平扩展的,如果要搞分库分表,费时费力。

这时候就可以借助MySQL的好伙伴Redis的能力。

Redis小哥可是单机支撑每秒几万的写入,并且可以做成集群,提高扩展能力的。

我们可以先将库存名额预加载到Redis,然后在Redis中进行扣减,扣减成功的再通过消息队列,传递到MySQL做真正的订单生成。

为什么要通过消息队列呢?

主要有两点好处,一个是这种投递的方式,可以让抢和购解耦。另一个是可以很方便地限频,不至于让MySQL过度承压。

面试官:如何设计一个靠谱的高并发秒杀系统?

我们说回Redis,如果请求量超过6W每秒,就要考虑使用多个Redis来分流。预计有100W请求量,我们就可以临时调度20个Redis实例来支持,一个5W/s,留点Buffer。

这种模式倒是不需要使用Redis Cluster那种一致性Hash的做法,直接前面接个Nginx,做负载均衡就可以了。

面试官:如何设计一个靠谱的高并发秒杀系统?

拒绝超卖

====

解决了高并发的问题,我们再来看看怎么防止超卖。

既然我们将库存名额加载到了Redis,那就需要精确计数。

我们抢购场景最核心的,有两个步骤:

第一步,判断库存名额是否充足;

第二步,减少库存名额,扣减成功就是抢到。

面试官:如何设计一个靠谱的高并发秒杀系统?

这里有一个问题要考虑,如果第一步判断的时候还有库存,但是由于是并发操作,实际调用的时候,可能已经没有库存了,这样就会造成超卖。

所以第一步和第二步都是需要原子操作的。

但是Redis没有直接提供这种场景原子化的操作。

遇事不要慌,仔细想一想,Redis是不是还有个特性,专门整合原子操作,对,就是它——Lua

面试官:如何设计一个靠谱的高并发秒杀系统?

Redis➕Lua,可以说是专门为解决原子问题而生,在Lua脚本中调用Redis的多个命令,这些命令整体上会作为原子操作来进行。

尽量避免少卖

======

少卖什么情况会出现呢?

库存减少了,但用户订单没生成。

什么情况会这样呢?

在Redis操作成功,但是向Kafka发送消息失败,这种情况就会白白消耗Redis中的库存。

面试官:如何设计一个靠谱的高并发秒杀系统?

作为一个专业的程序员,只要知道问题是什么、怎么发生的,问题就解决了一半。说白了,我们只需要保证Redis库存+Kafka消耗的最终一致性

但是一致性问题,一直是分布式场景的恶龙,要对付并不容易。

第一种,以最简单的方式,在投递Kafka失败的情况下,增加渐进式重试;

第二种,更安全一点,就是在第一种的基础上,将这条消息记录在磁盘上,慢慢重试;

第三种,写磁盘之前就可能失败,可以考虑走WAL路线,但是这样做下去说不定就做成MySQL的undo log,redo log这种WAL技术了,会相当复杂,没有必要。

面试官:如何设计一个靠谱的高并发秒杀系统?

针对少卖这种极端场景可接受的问题,一般选择第二种方式即可,毕竟是异常情况的小概率事件,真出问题了大不了人工介入。

打击黄牛

====

黄牛的恶劣影响,很多时候是被低估了。

不仅仅是侵害了正常用户的权益,同时由于黄牛善于使用脚本,很容易造成大量的恶意请求,让本就不富裕的服务器资源,雪上加霜。

通常来说,为了打击黄牛,最常见的方式是限购,一个用户最多只能抢到N份,这样可以大大保障正常用户的权益。

具体怎么做呢,为了性能,我们还是将限制逻辑加入到Redis中,所以我们的Lua脚本中,第一步查询库存,第二步扣减库存,需要优化为第一步查询库存,第二步查询用户已购买个数,第三步扣减库存,第四步记录用户购买数

面试官:如何设计一个靠谱的高并发秒杀系统?

这里需要注意的是,如果使用Redis集群,那么Redis的一致性Hash Key,需要根据用户来分Key,不然用户数据会查询不到。

有了限购,我们可以保证货品不会被黄牛占据太多,那么还剩一个问题,黄牛大多是通过代码来抢购,点击速度比人点击快得多,这样就导致了竞争不公平。

作为追求极致的coder,我们希望还能更进一步,做到竞争公平。

怎么解决呢?某个用户请求接口次数过于频繁,一般说明是用脚本在跑,可以只针对该用户做限制。

针对IP做限制也是常见做的做法,但这样容易误杀,主要考虑到使用同一个网络的用户,可能都是一个出口IP。限制IP,会导致正常用户也受到影响。

更好用的方案是加上一个验证码验证。验证码符合91原则,90%的时间,都用在验证码输入上,所以使用脚本点击的影响会降到很低。

面试官:如何设计一个靠谱的高并发秒杀系统?

当然,我们要明白没有银弹,这种方式缺点在于降低了用户的体验感。

故事尾声

我:这样一来,我们的秒杀场景就基本OK啦!

女朋友:

面试官:如何设计一个靠谱的高并发秒杀系统?

我:怎么样,听懂了吗?

女朋友:嗯嗯!(心虚的用力点头)我们能去秒杀了吗?

我:那我来检验一下?

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-7x6p9IGe-1713386050036)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-NYKAUOuk-1713386050036)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84002665/article/details/137898866

java开发面试:高并发秒杀系统如何设计与优化_三名狂客的博客-爱代码爱编程

转载链接 如今处在一个大数据时代,应届生找工作面试高级Java开发工程师时,经常会被问一些和大数据相关的问题,比如大数据处理问题、高并发处理问题、数据优化问题等,笔者曾经遇到两个比较经典的问题,高并发秒杀系统的设计优化问题

java面试官:兄弟,你确定double精度比float低吗?-爱代码爱编程

我有一个朋友,叫老刘,戴着度数比我还高的近视镜,显得格外的“程序员”;穿着也非常“不拘一格”,上半身是衬衣西服,下半身是牛仔裤运动鞋。 我和老刘的感情非常好,每周末我们都要在一起吃顿饭。这周,我们吃的是洛阳有名的吴家刀

秒杀系统设计-爱代码爱编程

前言 高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功。这类活动商家绝大部分是不赚钱的,说白了是找个

spring-爱代码爱编程

1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war,然后部署一个进程 优点: 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发(ssm+数据库)。 缺点:

jar包增量更新分析-爱代码爱编程

jdk自带工具jdeps,可分析class依赖关系(依赖的其它类和jar)。 团队,可以在此工具结果的基础上再详细分析对比出增量文件; 思路如下: jdeps分别分析出旧包和新包的文件依赖关系。并对比出新增的文件列表、删

kubernetes 审计日志采集与分析最佳实践-爱代码爱编程

Kubernetes 审计日志概述 Kubernetes 在 1.7 版本中发布了审计(Audit)日志功能,审计(Audit)提供了安全相关的时序操作记录(包括时间、来源、操作结果、发起操作的用户、操作的资源以及请求/响应的详细信息等),通过审计日志,我们能够非常清晰的知道 K8S 集群到底发生了什么事情,包括但不限于: 当前/历史上集群发生了哪些变

命令执行漏洞(二)-爱代码爱编程

Struts2框架命令执行漏洞 环境准备:虚拟机win2003     jspstudy2016     Struts Showcase靶场环境 查看历史相关漏洞在线平台 : 乌云(WooYun.org)历史漏洞查询: https://wy.zone.ci/searchbug.php?q=Struts2 知道创宇 Seebug 漏洞平

docker中安装jenkins,并在node和cloud上跑通基于源码控制scm的pipeline-爱代码爱编程

目录 一、摘要 二、部署和使用 1. docker部署jenkins 1.1 准备数据目录 1.2 拉取jenkins镜像并启动 1.3 初始化配置 1.3.1 登录容器查看初始化密码 1.3.2 访问jenkins并输入初始化密码 1.3.3 创建管理员账户 1.3.4 初始化完成 2. jenkins使用之多分支流水线 2.1

【java每日面试题】大厂是如何设计秒杀系统的?,2024年最新java开发工程师面试问题汇总-爱代码爱编程

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《20