Java知识库FAQ

1、post为什么会发送两次请求?

A:那是因为浏览器的安全策略(同源策略)决定的;会进行一次预请求,第二次才会真正发送post请求。

预检请求中包含了一些额外的头部信息,如 Origin 和 Access-Control-Request-Method 等,用于告知服务器实际请求的方法和来源。服务器收到预检请求后,可以根据这些头部信息,进行验证和授权判断。如果服务器认可该跨域请求,将返回一个包含 Access-Control-Allow-Origin 等头部信息的响应,浏览器才会继续发送实际的跨域请求。

使用预检请求机制可以有效地防范跨域请求带来的安全风险,保护用户数据和隐私。

2、单核CPU支持多线程吗?

A:支持。

多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢?
操作系统的设计者
巧妙地利用了时间片轮转的方式时间片是CPU分配给各个任务(线程)的时间,因为时间片非常短,所以CPU通过不停地切换线程执行。

3、ConcurrentHashMap 如何保证线程的安全性?

A:ConcurrentHashMap 是 HashMap 的线程安全版本,其内部和 HashMap 一样,也是采用了数组 + 链表 + 红黑树的方式来实现。

在 JDK1.7 版本中,ConcurrentHashMap 由数组 + Segment + 分段锁实现,其内部分为一个个段(Segment)数组,Segment 通过继承 ReentrantLock 来进行加锁,通过每次锁住一个 segment 来降低锁的粒度而且保证了每个 segment 内的操作的线程安全性,从而实现全局线程安全。

在 ConcurrentHashMap 中,采用了大量的分而治之的思想来降低锁的粒度,提升并发性能。其源码中大量使用了 cas 操作来保证安全性,而不是和 HashTable 一样,不论什么方法,直接简单粗暴的使用 synchronized关键字来实现

4、数据库出现死锁如何处理?

在这里插入图片描述

在这里插入图片描述

重点:第一条具体就是从操作的粒度可分为表级锁、行级锁和页级锁。

详细讲解

5、如何搭建10万QPS大流量、大并发优惠券系统?

  • 根据需求做出技术选型

存储

由于券模板、券记录这些都是需要持久化的数据,同时还需要支持条件查询,所以我们选用通用的结构化存储 MySQL 作为存储中间件。

缓存

由于发券时需要券模板信息,大流量情况下,不可能每次都从 MySQL 获取券模 板信息,因此考虑引入缓存
同理,券的库存管理,或者叫库存扣减,也是一个高频、实时的操作,因此也考虑放入缓存中
主流的缓存 Redis 可以满足我们的需求,因此我们选用 Redis 作为缓存中间件。

消息队列

由于券模板/券记录都需要展示过期状态,并且根据不同的状态进行业务逻辑处理,因此有必要引入延迟消息队列来对券模板/券状态进行处理。RocketMQ 支持延时消息,因此我们选用 RocketMQ 作为消息队列。

系统框架

发券系统作为下游服务,是需要被上游服务所调用的。公司内部服务之间,采用的都是RPC 服务调用,系统开发语言使用的是 golang,因此我们使用 golang 服务的 RPC框架 kitex 进行代码编写。

我们采用 kitex+MySQL+Redis+RocketMQ 来实现发券系统,RPC 服务部署在公司的 docker 容器中。

详细介绍

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bst@微胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值