上海某游戏小厂面试,也扛不住了...

news2024/11/25 4:24:06

今天分享一位同学面试上海某游戏公司的面经,同学的技术栈是Java后端,虽然不是大厂,但是一面面试也被问了 25 多个问题,时长也接近 1 小时了

面试过程中,也问到了 Linux socket 编程,游戏公司都会对网络协议和网络编程这一块要求比较高,所以投游戏公司的同学,需要重点准备网络方面的知识。

还有一点,游戏公司的开发岗除了技术要求之外,可能还会问你一下你对游戏的兴趣,平常玩什么游戏,对游戏有什么看法,因为工作内容就是开发游戏,如果对游戏没有热情,会觉得工作缺失了激情。

问题记录

介绍你的项目

balabal 了几分钟

Redis 缓存一致性

说了旁路缓存策略

如果这个时候一波海量请求,你怎么保证他们能读到数据
  1. 数据延迟肯定是有的

  2. 我个人认为可以做流量控制,限制读请求数量

  3. 当然,如果非的读的话。可以采用把删除缓存策略改为更新缓存策略

说说Redis 数据结构

Redis 有五大基本数据类型和四大新类型

五大基本类型是:

  1. String

  2. Hash

  3. List

  4. Set

  5. zset

每一种数据结构根据自身的特性有不同的使用场景:

  1. string:

    1. 计数器,因为 Redis 是单线程模型的,所以redis执行命令时原子性,所以他可以用来做计数器,例如 点赞计数、转发、库存数量等

    2. 分布式锁:setnx key value ex 时间

  2. hash:

    1. Hash 是 key-value 键值对,类似与 Java 的 HashMap, 查找时间复杂度是 o(l)

    2. Hash 的底层数据结构是hashtale 和压缩表

    3. 当 元素个小于 512 并且所有元素大小小于 64 字节,采用压缩列表作为底层数据结构

    4. 反之采用 hashtable

    5. 它适合做购物车,用户作为 id、商品 id 位 field、商品数量为 value

  3. List (说到 List 被面试面试官打断了,下一个)

事务了解吗?

了解,acid 事务四大特性说了一遍

事务隔离级别有哪几种
  1. 四种

    1. 读未提交

    2. 读已提交

    3. 可重复读

    4. 串行话

  2. 读未提交就是一个A事务能读到另一个B事务未提交的事务,当这个B事务发生回滚时, A 事务读到的是脏数据。它有脏读、不可重复读、幻读问题

  3. 读已提交就是只能读到对方事务已经提交的事务,它解决了脏读问题,但是有不可重复读和幻读问题(说到这里突然被面试官打断)

追问:隔离级别是由啥保证的
  1. mvvc 机制 和 锁机制

可重复读为什么完全不能解决幻读

在可重复读隔离级别下,事务 A 第一次执行普通的 select 语句时生成了一个 ReadView,之后事务 B 向表中新插入了一条 id = 5 的记录并提交。接着,事务 A 对 id = 5 这条记录进行了更新操作,在这个时刻,这条新记录的 trx_id 隐藏列的值就变成了事务 A 的事务 id,之后事务 A 再使用普通 select 语句去查询这条记录时就可以看到这条记录了,于是就发生了幻读。

图片

因为这种特殊现象的存在,所以我们认为 MySQL Innodb 中的 MVCC 并不能完全避免幻读现象。

进程与线程的区别

常规八股

线程池有哪几个类型的
  1. newSingleExecutor

    1. 只有一个核心线程,也是最大线程数。队列采用的是 LinkedblockingQueue 无界阻塞队列。极端情况下会有  OOM 问题

    2. 它的工作原理是当提交任务是当没有工作线程时,会将任务放入到阻塞队列中,

    3. 有核心线程时,获取阻塞队列取任务执行,执行完了接着从阻塞队列执行

    4. Keepalive存活时间是 0,因为本来就没有非核心线程

    5. 它的场景是串行化的场景,因为他只有一个工作线程

  2. newCacheExecutor

    1. 核心线程数是 0,队列采用的是 SynchrousQueue 阻塞队列。最大线程数是 Integer.Max_value 的默认值,KeepAiveTime 是 60 s,也就是线程执行完了处于空闲状态时,过 60 s 就会销毁,如果频繁的创建线程会产生 OOM 问题

    2. 它的工作原理是提交任务,没有线程时,任务放到阻塞队列

    3. 创建核心线程时取队列执行任务,插入一个元素必须等工作线程取出消费,如果队列没有任务则会阻塞

    4. 它的吞吐量比 newFixedExecutor 更高,它适用于并发量大但是任务执行周期短的场景

  3. newFixedExecutor

  4. SheculedExecutor

    1. 周期性去执行任务。队列是 DeayQueue 延迟队列,

    2. 它的工作原理是 当工作线程数小于最大线程数,首先会去创建线程去执行任务

    3. 当达到核心线程数时,会将任务放入到阻塞队列,

    4. 所谓周期性就是 他去任务队列取出任务时,会修改一个 time 变量 位下次要执行的时间

    5. 然后放入到队列中

说说各层有哪些协议
  1. 应用层:DNS、HTTP、IP

  2. 传输层:TCP、UDP

  3. 网络层:IP、ICMP

  4. 数据链路层:ARP

  5. 物理层:不记得了

说说一个数据怎么在网络各层分割报文的

发送数据方

  1. 传输层:加上 TCP 报文头

  2. 网络层:加上 IP 头

  3. 数据链路层:加上帧头和帧尾

  4. 物理层:则是转换为包含0、1的二进制比特流

讲讲 TCP 三次握手
  1. 首先刚开始双方处于关闭连接状态,服务端处于监听端口状态,也就是 Listen 状态

  2. 第一次握手:客户端首先生成随机初始化序列号seq = x,并放到 TCP 头部的32位序号字段中,同时将 SYN 标志设置为 1,表示这是一个 SYN 报文,然后发送给服务端,接着客户端处于 SYN_SENT

  3. 第二次握手:服务端收到客户端发送过来的 SYN 报文后,首先也会生成随机初始化序列号seq = y,并放到 TCP 头部的32位序号字段中, 并对客户端的序列化 seq = x + 1 作未确认应答号,然后放到 TCP 头部的确认应答字段中,同时将 SYN 和 ACK 标志设置为 1,表示这是一个 SYN-ACK 报文。把该报文发送给客户端后,服务端处于 SYC_RCVD

  4. 第三次握手:客户端收到服务端发送过来的 SYN_ACK 报文,会发送确认报文给服务端,这个确认报文是对服务端的初始序列化 seq = y + 1,  客户端进入 ESATBLISH 状态

  5. 服务端收到后,也进入 ESTABLISHED 状态

你刚刚说的 Listen、SYN_SENT、SYN_RCVD、ESTABLISHED 状态有什么含义?
  1. LISTEN 状态表示监听是否有连接到来,当有连接到来时,它获得已经连接的 socket

  2. SYN_SENT 表示 客户端具备发送数据能力。但还不具备接受数据能力, 此时需要等待服务端的确认

  3. SYN_RCVD 表示服务端具备接受数据的能力和发送数据的能力,此时需要等待客户端的确认

  4. ESTABLISHED 表示我已经建立连接了,我可以发送数据了

客户端发送了数据给服务端,服务端返回对方成功确认收到的确认信息,这个时候是否可以肯定服务端收到了数据
  1. 不一定,服务端有一个接受缓存区,此时服务端还在处理前面的数据,有可能服务端发生异常了,导致接收缓冲区的数据未被处理

那怎么解决这个问题呢?
  1. 嗯,触发重传机制,客户端重新发送数据?(懵逼)

客户端想尽快关闭连接,应该怎么办?
  1. 发送 FIN 报文?

  2. RST 报文好像也可以断开连接

Socket 编程了解过吗,什么是 socket
  1. 了解过

  2. Socket 是一个套接字

socket 的流程

不会(我搞 java 的,没研究过 socket 编程,完了)

基本 socket 做好了封装,你了解吗

刚开始懵逼,后来想到才是 Netty 这个框架

Socket 和 http 有什么区别?
  1. Socket 是一个套接字接口

  2. Http 是请求连接,http 是 tcp 连接的管理器

你说说 spring 的生命周期?

大致分为五个阶段,创建前准备阶段、实例化阶段、依赖注入阶段、容器缓存阶段、实例销毁阶段

后面从说了每个阶段是干嘛的(面试官反应逻辑讲的不够清楚,这里我就不列出来的)

事后复习总结如下:

  1. 创建前准备阶段:

    1. Spring 启动后,扫描 @ComponentScan 注解配置的路径下的所有 .class 文件,

    2. 类加载其根据类名加载获取类的 Class 对象

    3. 判断类上是否有 @Component、Service 等注解找出 bean 对象

    4. 给每个符合条件的 bean 创建 BeanDefintion 对象用于存放 Class 对象、作用域等信息,作用域包括 singletion、prototype、request 等,然后添加进 beanDefinitionMap, key 值存放 bean 的名字,value 是对应的 BeanDefition

    5. 扫描 bean 对象

    6. 遍历 beanDefinitionMap,创建

MyBatis 中 ${} 与 #{} 的区别
  1. 无法防止注入攻击,在开发中尽量使用{}

  2. #{} 是占位符,预编译处理,${} 是拼接符,字符串替换,没有预编译处理

感觉

面试官说我们是做游戏开发,然后又问我你平时喜欢打游戏吗,我说近些年很少打游戏的。以前很喜欢玩,后面觉得腻了,然后面试官说做游戏开发需要对游戏很了解的,对游戏很热爱的,否则难干下去

反问环节说我基础还算行,就是可能在业务方面可能不匹配

不足之处

socket编程不太熟悉,计网还需加强学习

Spring bean 的生命周期 没有让面试官听懂

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

封神台----为了女神小芳

目录 目录 前言 文章框架 1,题目 2,实验前的准备 3,进入传送门 4,使用Sqlmap对网站进行监测 4.1.检测目标地址是否存在注入点 4.2、检测数据库中的库名 4.3、选择需要爆的库开始爆表名 4.3.1,后面内容的一些注意点: 4.3.2,开始进…

esxi下实现ikuai相同的两个网卡,单独路由配置

1.首先安装配置双网卡。 因为esxi主机只接入了一根外网的网线,那么我们这两个网卡都是一样的网卡,具体的到系统里面进行设置。 2.开机安装系统 进入配置界面,此处就不用多说了,可以看我之前的文档,或者网上其他人的安…

中文版Chatbase轻松帮你实现智能回复

在数字时代,信息量可以说是爆炸性增长,很多企业网站都面临着一个共同的问题:如何在繁忙时还能为访客提供及时而有用的回复?那我可以坚定地说AI问答机器人可以做到。很多人都知道使用Chatbase可以创建聊天机器人来即时回答访客的问…

vue2配置环境变量并且nginx运行成功

需求:我在vue项目配置了生产环境和开发环境,之后通过proxy代理的方式把地址转发到真实的服务器地址上用于请求接口,之后把项目打包后上传到nginx上,之后接口报错404,但是本地运行是可以访问的,找了很久终于…

滑动窗口详解

滑动窗口本质其实也是一种双指针算法,只是因为它维护的区间随着遍历的进行在不停变化,所以形象地称为“滑动窗口” 一、⻓度最⼩的⼦数组 题目要求找到满足条件的长度最小的子数组,我们先来想想暴力的做法,再来想想能不能优化&am…

LeetCode 1462. 课程表 IV:拓扑排序

【LetMeFly】1462.课程表 IV:拓扑排序 力扣题目链接:https://leetcode.cn/problems/course-schedule-iv/ 你总共需要上 numCourses 门课,课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisite…

npm 清缓存(重新安装node-modules)

安装node依赖包的会出现失败的情况,如下图所示: 此时 提示有些依赖树有冲突,根据提示 “ this command with --force or --legacy-peer-deps” 执行命令即可。 具体步骤如下: 1、先删除本地node-modules包 2、删掉page-loacl…

redis实战-redis实现异步秒杀优化

秒杀优化-异步秒杀思路 未优化的思路 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是否是一…

vue中如何给特殊字段设置插槽

大纲: <template><div><div><span>卡号</span><el-input type"text" v-model"cardNo" clearable placeholder"请输入卡号" /><el-button type"primary" plain icon"el-icon-search"…

【Python】从入门到上头— 多进程与分布式进程(10)

文章目录 前言一.多进程1.fork()系统调用2.OS模块3.multiprocessing模块4.进程池&#xff08;multiprocessing Pool模块&#xff09;5.子进程&#xff08;subprocess模块&#xff09;6.进程间通信7.小结7.1.学习小结7.2.Python分布式进程报错&#xff1a;pickle模块不能序列化l…

Axure RP 10汉化版下载 Axure RP 10 mac授权码

Axure RP10汉化版是最强大的计划&#xff0c;原型设计和交付给开发人员的方法&#xff0c;而无需编写代码。能够制作逼真的&#xff0c;动态形式的原型。 Axure RP 10汉化版下载 Axure RP 10 mac授权码 RP 10有什么新功能&#xff1f; 1.显示动态面板 使用Axure RP 10&…

【FAQ】安防监控/视频汇聚/云存储/智能视频分析平台EasyCVR显示CPU过载,如何解决?

视频云存储/安防监控/视频汇聚平台EasyCVR基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频监控系统EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云…

环境变量与Path环境变量

“环境变量”和“path环境变量”其实是两个东西&#xff0c;这一点大家一定要区分开&#xff0c;不要混为一谈。 “环境变量”是操作系统工作环境设置的一些选项或属性参数。每个环境变量由变量名和文件路径组成的&#xff0c;可以设置很多个环境变量。 我们一般使用环境变量…

把数组b中的值拷贝给数组a numpy.copyto(a,b)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 把数组b中的值拷贝给数组a numpy.copyto(a,b) [太阳]选择题 请问关于以下代码最后输出结果的是&#xff1f; import numpy as np to np.array([1, 2]) print("【显示】to ",to) …

GLTF扩展使用及开发指南

glTF 扩展扩展了基本 glTF 模型格式。 扩展可以引入新的属性&#xff08;包括引用外部数据的属性&#xff0c;并且扩展可以定义这些数据的格式&#xff09;、新的参数语义、保留的 ID 和新的容器格式。 扩展是针对特定版本的 glTF 编写的&#xff0c;并且可能会在更高版本的 gl…

高忆管理:央行利好提振 A股三大指数收红

上证指数日K线图 受央行利好音讯刺激&#xff0c;9月11日A股商场震荡走强&#xff0c;三大指数收红&#xff0c;北上资金日内“去而复返”&#xff0c;由净流出转为净流入。 因为上周末音讯面略显平平&#xff0c;9月11日A股开盘较为分解&#xff0c;三大指数涨跌不一&#x…

518企业年会抽奖软件,支持撤消、轮空缺席弃奖

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 操作入口 主窗口上按 CtrlZ&#xff0c;打开…

Linux入门-网络基础|网络协议|OSI七层模型|TCP/IP五层模型|网络传输基本流程

文章目录 一、网络基础 二、网络协议 1.OSI七层模型 2.TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程 1.网络传输流程图 2.数据包封装和分用 四、网络中的地址管理 1.IP地址 2.MAC地址 一、网络基础 网络发展最初是独立模式&#xff0c;即计算…

系统学习Linux-防火墙(Firewall)

目录 防火墙的作用 防火墙分类 防火墙性能 硬件防火墙 软件防火墙 扩展&#xff1a;Web应用防火墙(WAF) 硬件防火墙与软件防火墙比较 iptables netfilter/iptables功能 iptables概念 iptables工作一句——规则&#xff08;rules&#xff09; iptables中链的概念 i…

【面试必刷TOP101】反转链表 链表内指定区间反转

目录 题目&#xff1a;反转链表_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1…