首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
靠谱的小龙虾拒绝内卷
武汉理工大学 Java
发布于湖北
关注
已关注
取消关注
@1个offer就够了:
项目
秒杀项目 1. 项目做了什么 redis实现分布式Session redis做缓存减轻数据库压力 服务器内存标记减少对redis的访问 rabbitmq进行异步处理,提高了系统的响应速度,减少了用户的无响应等待时间 秒杀URL隐藏、对恶意请求进行限流防刷 超买超卖问题 2. 用户的登录状态如何保持:分布式session 用户登录后,将user和token存入redis,将token存入cookie,redis和cookie设置相同的存活时间,将cookie返回给前端 客户端下一次请求时,从request请求头中拿出token,根据token从redis中查询user,判断用户的状态,进行同步,添加到Model中 3. 缓存是如何预热的 实现InitilizingBean接口,重写afterPropertiesSet()方法,从数据库中查询goodsid和库存,存入redis,使用HashMap标记goodsid为false 4. 如何进行限流:AccessLimit注解、拦截器进行计数校验 使用AccessLimit注解,设置两个属性,maxcount和second 在获取URL的模块上使用这个注解,初始化两个属性maxcount和second为5 web拦截器拦截请求 反射判断当前模块是否使用了AccessLimit注解,没有就放行,有就进行属性校验 从request中获取token,根据token从redis中获取user 反射获取注解的两个属性,second和maxcount,根据userid从redis中获取当前对象的count计数,如果count为null,将count设置为1,过期时间设置为second。如果count小于maxcount,incr+1,如果count大于maxcount,提示警告 5. 数据库补充库存之后如何反馈到内存标记:单机和集群 单机:将hashMap设置为public,定期检测数据库库存,如果有库存,就重置内存标记 集群:将hashMap设置为public,定期检测数据库库存,如果有库存,rabbitmq通知服务器重置本地的内存标记 7. Redis预减库存成功但数据库库存没有减少出现什么情况:rabbitmq消息丢失 问题可能出现在rabbitmq,rabbitmq消息丢失可以分为三种情况:生产者丢失了消息、rabbitmq丢失了消息、消费者丢失了消息 生产者丢失了消息 开启事务模式,rabbitmq成功接收消息就提交事务,失败就回滚事务重发消息。事务模式是同步的,吞吐量低 开启confirm模式,rabbitmq成功接收消息返回一个ack消息,失败回调一个nack接口,重发消息。confirm模式是异步的,吞吐量大 rabbitmq丢失了消息 队列持久化:durable=true 消息持久化:发送消息时,deliverMode(2) 消费者丢失了消息:消费过程中消息被删除 关闭自动ack机制,消费者消费完之后手动进行ack 8. 缓存数据一致性:延时双删 对于这个系统来说,并没有强制要求缓存和数据库的库存一致。不一致的情况又两种 缓存的库存比数据库的小,这种情况会导致商品卖不完,不行 缓存的库存比数据库的大,这种情况其实是可以的,这样不会发生超卖问题的,因为超卖问题是在数据库的SQL语句层面解决的,SQL语句限制只有当数据库的库存足够时才能减库存下订单 所以可以在预热数据时将数据库的库存稍微设置大一点,这样既能保证商品能够卖完又不会发生超卖问题 对于严格要求缓存数据一致的项目,为缓存的key设置过期时间是解决这个问题的最终方案 采用延时双删:先删除缓存,再更新数据库,休眠一段时间,然后删除缓存。这样就可以将回填到缓存的脏数据删除,后面的读会回填正确的数据到缓存 9. 下单后如何减库存:下单就减库存、付款减库存、临时订单 三种策略 下单就减库存。最理想但是不可能实现,用户不可能在抢到订单的同时就付款减库存 付款减库存。用户可能因为网络问题没来得及付款导致购买失败 生成临时订单,用户在订单有效期内付款,才生成真实订单和减数据库库存 可以采用第三种策略 用户下订单后,预减redis的库,然后在redis中生成一个临时订单,设置过期时间,前端开启倒计时 如果用户在期限内付款,触发检查,检查数据库的库存是否大于0,在redis和数据库生成真实订单,减数据库库存 如果临时订单过期,redis库存回填+1,通知用户购买失败 10. 为什么要进行异步处理、使用MQ和没使用MQ的流程 如果不使用MQ进行异步处理,用户从抢购开始到获得抢购的结果,系统需要执行的操作量多,抢购和获取结果的操作要全部完成才能返回响应给前端,用户等待的时间久 查询redis,判断用户是否超买 查询内存标记,判断库存是否不足 redis预减库存,如果预减后库存小于0,将内存标记置为false 查询数据库,判断数据库库存是否不足,判断用户是否超买 下订单,减库存 将抢购结果返回给前端,如果是抢购成功,显示订单详情页面。如果抢购失败,通知用户 使用MQ进程异步处理后,将请求入mq后,先返回状态码让前端页面显示正在获取结果,减少了用户的无响应等待时间,然后再去获取抢购结果,将抢购和获取抢购结果分开执行 查询redis,判断用户是否超买 查询内存标记,判断库存是否不足 redis预减库存,如果预减后库存小于0,将内存标记置为false 将请求入MQ,返回一个状态码给前端,前端显示用户等待,前端再请求到result模块获取结果 与此同时,rabbitmq会进行下订单减库存,在redis和数据库中生成订单 前端请求到result模块,从redis和数据库中查询是否存在当前用户的订单,有久显示订单详情页面,否则提示用户购买失败 11. rabbitmq使用了哪一种工作模式、一共有哪几种工作模式:simple、work、发布订阅、routing、topic 使用了routing路由模式:为queue添加了一个字符串标识,接收者监听标识了这个字符串的queue 一共5种 simple:一个发送者一个接收者 work:一个发送者多个接收者,谁先拿到就消费 订阅发布:发送者将消息发送给交换机,交换机将消费转发给订阅者 routing:使用标识标注queue,接收者监听标识的queue topic:routing的一种,标识可以使用通配符 12. rabbitmq如何保证消息有序:为什么要有序、项目中如何实现有序、乱序的情况、有序的情况 为什么要有序:如果多个消息之间存在上下文的关系,消息乱序执行可能会导致数据错误 项目如何实现有序:一个消息队列一个消费者,消费者没有使用多线程处理 乱序:消费者使用多线程,多个消费者读取,执行时机不定 有序:读取消息后存入队列,有序执行 13. 如何保证消息不会被重复消费:保证消息的幂等性 保证消息的幂等性,如果消息已经被消费过,丢弃不消费 发送消息时,生成一个唯一的id,将消息存入redis,消费时根据id从redis中查询,如果有,消费,消费完之后删除,没有就丢弃 14. 如何解决超买超卖:唯一索引和SQL限制 超买:为订单表的userid和goodsid添加唯一索引,确保一个用户对一个商品不会生成两张订单 为了减少对数据库的访问,下订单时在redis中生成订单,下一次判断用户超卖就可以直接查询redis来判断,不用请求到数据库 超卖:SQL语句限制只有当库存大于0时才能减数据库库存 为了减少对数据库的访问,使用redis和内存标记进行数据预热,用户抢购时,先判断超买,然后查询内存标记,最后再减redis库存 15. 项目压测:JMeter 5W并发对秒杀接口进行压测,创建5000个HTTP请求,循环10次 直接访问数据库时,QPS1300+ 使用了redis、内存标记、MQ后,QPS2100+ 因为秒杀URL要动态生成,所以先使用工具类生成5000个用户,保存到数据库中,然后将这5000个用户登陆到系统,生成token令牌,将token保存到txt文件,JMeter导入txt文件,提取token,进行压测,查看聚合报告,查看QPS 16. Nginx负载均衡和反向代理有什么区别 负载均衡是将并发的请求分发给后端的服务器集群,更注重对请求的分发减轻并发压力 反向代理是Nginx作为代理服务器,将前端请求转发给指定的后端服务器,将后端服务器的响应转发给前端 17. Nginx负载均衡策略:轮询、权重、iphash、urlhash、fair、least_conn 轮询:默认,顺序访问服务器 weight权重:在轮询的基础上,对服务器节点配置了权重,权重越大,越容易被击中 iphash:对客户端的ip进行hash计算,再对服务器数量进行取模,每个客户端ip都有一个固定的服务器节点 urlhash:对url进行hash计算,每个url都有对应的服务器节点 least_conn:请求到最少连接的服务器节点 fair:请求到响应速度最快的服务器节点 18. 一致性hash iphash需要对服务器数量进行取模运算,如果进行扩容和缩容影响范围大 一致性hash:设置一个hash环,先对服务器ip进行hash计算,放置到hash环上,客户端请求时,对客户端ip进行hash计算,对应到hash环上,顺时针查找最近的服务器节点 19. 如何设计一个秒杀系统(设计的思路) 秒杀系统可能出现的问题 高并发 超买超卖,超买不一定要处理但是超卖一定要处理 安全性问题 针对上述问题展开进行考虑解决 高并发:系统响应慢、防止数据库被打崩 防止数据库被打崩:使用redis作为缓存减轻数据库压力,使用内存标记减轻redis压力 系统响应慢:使用mq进行异步处理,将抢购和通知抢购结果分成两部分,减少用户的等待时间 超买超卖 超买:订单表唯一索引限制 超卖:SQL语句限制库存大于0时才能减 安全问题 接口动态生成:根据当前user使用MD5加密生成URL,存入到redis进行校验 接口限流:使用注解对获取URL的模块进行限流,限制5秒内只能请求5次 RPC项目 1. 微服务和分布式 微服务:是一种设计架构方式,简单来说一个微服务就是一个功能,可以单独部署和运行。服务粒度小、拓展方便、团队开发时分工明确 分布式:是一种系统部署方式,将大的系统拆分成多个小的模块,分别部署到不同的服务器上。分布式可以实现高并发和高可用 微服务和分布式的区别:微服务是分布式部署,但是分布式不一定是微服务,比如分布式集群,就是将多个功能相同的应用部署到多台服务器上,实现高并发和高可用,整个集群还是单一功能的应用 2. 微服务框架有哪些 SpringCloud:基于HTTP请求,自带一个Eureka注册中心 阿里的Dubbo:基于RPC请求,只支持Java,需要第三方注册中心 谷歌的GRPC:基于HTTP2.0请求,使用protobuf序列的IDL文件生成服务器和客户端通信的代码 Dubbo支持Java,可以自定义协议和序列化方式 3. RPC是什么、架构、RPC和HTTP有什么区别 RPC是remote procedure call,远程过程调用,客户端通过网络调用远程服务器的服务进行处理的一种请求方式, 架构: 客户端:服务发现,提供接口服务名请求到注册中心,得到服务所在的服务器的IP和端口进行远程调用 服务器:服务暴露,服务器将接口服务和自身IP地址和端口注册到注册中心 注册中心 服务发现:根据客户端提供的接口名查询对应服务器的IP和端口 服务管理:将服务器接口注册成永久节点和临时节点 负载均衡:对客户端的请求进行负载均衡 核心功能 序列化和反序列化:实现跨网络传输 编码和解码:选用TCP协议,通过收发双方约定数据包的长度解决TCP粘包问题 网络传输:大部分RPC框架都是使用TCP协议的,也可以使用HTTP协议,比如GRPC选用的就是HTTP2.0协议 RPC和HTTP HTTP: 只能使用HTTP协议,如果是HTTP1.1版本,请求报文存在大量的无用信息,报文体积大,传输效率低,也可以使用HTTP2.0,封装成RPC来使用。 传输的是JSON信息 负载均衡需要借助Nginx等外部组件实现 一般用于对外的请求调用 RPC: 可以使用HTTP或者是TCP,自定义TCP报文格式,使请求报文的体积减小,解决TCP粘包问题。也可使用HTTP2.0,有效减小请求报文的体积,提高传输效率。 传输的是byte字节 可以自定义负载均衡策略 公司内部的服务调用,传输效率高 4. 拆分Dubbo功能:基于RPC请求、传输byte、TCP粘包、第三方注册中心功能 基于RPC请求方式:使用Netty实现高效的TCP传输 传输byte:序列化和反序列化 TCP粘包:编码和解码,编码时将byte数组的长度传入buffer,解码时提取byte数组的长度,创建相同大小的byte数组接收 第三方注册中心:zookeeper实现服务管理、负载均衡 5. Netty:为什么要用Netty、Netty模型、解决TCP粘包、序列化与反序列化 1. Netty是什么 Netty是一个网络通信框架,它对Java的NIO非阻塞IO进行了封装,简化了使用的难度 2. 为什么用Netty:并发高、传输快、封装好 并发高:Netty是基于Java中的NIO开发的,对应操作系统中的多路复用IO,将监听和处理分开进行,由selector多路复用器同时监听多个客户端,有事件就将请求交给线程进行处理,可以让单个线程多次处理请求。而BIO是由线程独立完成监听和处理,这样单个线程能够处理的请求就变少了 传输快:NIO的零拷贝特性,bytebuf 封装好:Netty对Nio进行了封装,简化了Nio的使用难度,比如Nio在解决TCP粘包问题时,需要调用的API包多,处理起来繁琐。而Netty提供了两个类,MessageToByte和ByteToMessage,继承这两个类来自定义编码器和解码器,编码时先将序列化之后的byte数组的长度发送到buffer,解码时先从buffer中提取byte数组的长度,创建相同长度的byte数组进行接收。 2. Netty模型:单Reactor单线程、单Reactor多线程、主从Reactor、Netty的IO模型 单Reactor单线程:使用一个Reactor处理器同时监听多个客户端,有事件发生就读取分发给服务器的Eventhandler处理 单Reactor多线程:使用一个Reactor处理器同时监听多个客户端,如果是连接请求,分发给Acceptor处理器进行连接。如果是读写请求,分发给handler,handler调用send方法将请求发送给线程池处理,调用read读取结果 主从Reactor多线程:有父子Reactor,父Reactor负责监听客户端,如果是连接请求,分发给Acceptor处理器进行连接。如果是读写请求,则分发给子Reactor,子Reactor将请求分发给handler,handler调用send将请求分发给线程池,调用read读取结果 Netty的IO模型:Bossgroup负责监听客户端,Bossgroup的Nioeventloop循环调用accept读取事件,将事件通过channel注册到Workergroup,Workergroup的Nioeventloop循环调用accept读取事件,分发给channelhandler进行处理 3. TCP粘包问题:为什么会出现TCP粘包、如何解决TCP粘包 发送方在发送时为了提高发送效率,将发送间隔短的几个数据包打包成一个大的包发送,接收方无法拆分数据包 编码:继承MessageToByte 调用序列化方法,将数据序列化为byte数组 将byte数组的长度写入buffer 将byte数组写入buffer 解码:继承ByteToMessage 提取编码的序列化方式,读取byte数组长度 创建相同大小的byte数组,接收byte数组 4. 序列化和反序列化:序列化原理、主流的序列化方式 序列化原理:跨网络传输,序列化把java对象序列化为byte数组(MessageToByte),反序列化把byte数组恢复为java对象(ByteToMessage) 主流的序列化方式 Serialized:Java自带的序列化方式,无法跨语言,效率低 Protobuf:json和xml,跨语言,拓展性好,支持c++,java,pyhton fastjson:json,效率高,但是可能出现类型转换错误 jackson:和fastjson类似 gson:json,功能强大,但是性能比fastjson稍微差 JSON格式:使用fastjson,可能出现类型丢失 序列化:object.toJsonObject() 反序列化 request请求(客户端 to 服务器),遍历byte数组,request.setParam()存入参数 respons回应(服务器 to 客户端),遍历byte数组,response.setData()存入数据 Serialized格式 序列化(对象 to byte):ObjectOutputStream写入ByteArrayOutputStream 反序列化(byte to 对象):ByteArrayOutputStream写入ObjectOutputStream 5. Netty实现长连接的心跳检测:以写事件检测为例 在客户端中加入IdleStateHandler,设置写事件触发时间为5秒 如果客户端超过5秒未写入数据,触发心跳检测,向服务器发送心跳包 服务器收到心跳包后做出回应 如果服务器连续收到三次客户端的心跳包,说明客户端可能已经挂了,就断开连接 之后,如果客户端重新上线,发现连接已经断开了,客户端重新发起连接请求建立连接 6.zookeeper注册中心:注册中心是什么、有哪些注册中心、zookeeper心跳检测 1. 注册中心是什么 注册中心在RPC模型中相当于一个中间代理,客户端如果想要调用远程服务器的服务,必须要先连接到远程服务器,但是如果每一次都要事先知道服务器的IP和端口,很不方便。所以出现了注册中心,服务器可以将业务挂载到注册中心,客户端请求到注册中心,提供服务名,查找目标服务器进行连接。 2. 服务暴露:永久节点和临时节点 永久节点:服务器下线后,不删除节点 临时节点:服务器下线后,节点被删除,临时节点没有子节点 3. 服务发现 客户端提供接口名,请求到注册中心,注册中心调用getChildren.getPath()查询目标服务器的IP和端口,客户端连接到远程服务器 4. 负载均衡:轮询和随机 轮询:从-1开始递增,ipList.size()取余 随机:random.nextInt(ipList.size())随机获取节点 5. zookeeper的心跳检测 目的:维持客户端和服务器之间的长连接 原理: 客户端:如果60s内没有收到服务器的消息,发送心跳包,如果3次(180s)都没有收到服务器的消息,客户端主动断开这个连接 服务器:如果60s内没有收到客户端的消息,发送心跳包,如果3次(180s)都没有收到客户端的消息,服务器主动断开这个连接
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
01-22 12:40
滴滴_运维开发工程师(准入职员工)
图拉斯内推,图拉斯内推码
ai面总结:AI调教的很好,问的问题很有意思,整场面试不会有很大的压迫感,追问大多是根据你的回答提问。总时长:35分钟Q1:自我介绍,重点介绍一下个人背景和大学期间的主要经历。Q2:你对于在一家公司长期发展有什么看法?你认为哪几点因素会让你在一家公司长期工作?(有追问)Q3:你取得过的最大成就是什么?过程中最大的难点是什么?你是如何突破的?最终的结果怎么样?(有追问2个)Q4:请描述一个过往遇到的最有压力困难或最具挑战的一个场景,你是如何解决的?对你有什么影响?(有追问)Q5:依你的看法,请描述一个你近期完成的项目任务,如果重来一次,你会做哪些不同的事情来提升结果?(有追问2个)Q6:电商运营...
点赞
评论
收藏
分享
01-26 15:19
汤臣倍健_市场倍优生(准入职员工)
图拉斯内推,图拉斯内推码
面经:蓝禾的流程推得很快,基本上投完两天就接到了hr的初试电话,直接进行了初试。初试全程大概三十分钟,hr小哥态度很和善。主要问了实践经历获奖的情况最有成就感的事情对电商运营的理解选择公司的标准等,都是比较常规的问题。图拉斯2026届校招启动,今年HC翻倍,抓紧投递~【我们是】图拉斯(原蓝禾) 是一家集产品、设计、研发、品牌、营销和大数据运营于一体的创新型科技公司,总部位于中国深圳,全球员工规模超3000人。【base】深圳【岗位】运营(国内)、运营(国外)、营销、设计、研发技术、职能内推链接:https://lanhevip.jobs.feishu.cn/s/gAwh1MlZJsw内推码:H...
点赞
评论
收藏
分享
2025-12-15 14:25
云南大学 Java
现在这简历能直接找实习吗
想寒假找到,需要伪装为27届的吗
lei22:
入职可能会看学信网,最好别伪装,这个简历找实习肯定是够的,肯定会有收 28 届实习生的公司的,多投就行
点赞
评论
收藏
分享
2025-12-09 12:09
已编辑
北京邮电大学 Java
面试小公司被说作弊
jrm谁懂啊,以前看乐子现在照镜子谁能知道这事能发生在自己身上说我回答太官方像背书我说我闭着眼答呗,他还说算了我说你怀疑的时候怎么不追问,怎么不问灵活点?逮着上古时代的八股搁这问,回来你叭叭问完我叭叭答完,一句作弊完事,六百六十六手写个最大子数组和,我直接记事本默写了,上古时代的题。然后他让我暴力写一遍……我追问他为啥觉得我作弊,他说你思考一会一直瞅一个地方,然后就都说出来了,背书一样没有思考我说我现在问你个问题你不思考能秒答吗?他来了句不能,因为我不是研究生……也不卖关子,公司名 银河智学20-99人小公司有录音有截图,存着留以后讲段子
专业码bug百年:
不会面试官没上过大学吧
点赞
评论
收藏
分享
01-22 14:31
小红书_后端开发_REDstar算法工程师(准入职员工)
禾赛科技内推,禾赛科技内推码
禾赛科技 嵌入式开发(操作系统)面经⚜技术是真的过硬啊,秋招嵌入式被拷打的最狠之一。原定45分钟,拷打一个半小时,涉及知识面特别广,实际问的比这还要多,记忆有限。不过也无后续,但也没挂,估计在L3缓存里面吧⭕一面(9.18)1. 自我介绍2. 项目介绍3. 有没有测量IMU精度4. 串口有几根线,中断配置?5. IIC有几根线?讲一讲怎么通信?详细说一下读取寄存器的流程6. 说一说任务有哪几种状态?就绪和阻塞的任务放在哪里?放在同一个链表上面吗?7. 任务怎么进入阻塞态?(主动挂起,被强占,争取不到资源等)8. 说一说死锁?9. 怎么解决死锁问题?(获取不到锁的时候,释放本身的资源)10. 有...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
J人永远闲不下来于是去提前实习
2611
2
...
牛客吐槽大会 | 有槽不吐,留着过年?吐完领现金红包,痛快!
2434
3
...
大厂提前实习对AI开发的新感悟
2387
4
...
拥抱AI,程序员的最后出路
2377
5
...
mentor视角下的优秀实习生
2334
6
...
真正会被取代的,是你心里面的幻觉
2004
7
...
努力挣钱的意义具象化了
1788
8
...
马斯克最新炸裂采访,AI会带走一半工作岗位,普通人将何去何从?
1675
9
...
去独角兽做龙头还是去大厂做凤尾
1653
10
...
我身材再曼妙,也没有我的工资好笑!
1457
创作者周榜
更多
正在热议
更多
#
牛客吐槽大会
#
3644次浏览
73人参与
#
机械人你知道哪些单休企业
#
83205次浏览
415人参与
#
今年春招是金一银二嘛?
#
9524次浏览
123人参与
#
参加完秋招的机械人,还参加春招吗?
#
103896次浏览
686人参与
#
1月小结:你过的开心吗?
#
2174次浏览
53人参与
#
抛开难度不谈,你最想去哪家公司?
#
5299次浏览
125人参与
#
为什么有人零实习也能进大厂?
#
5846次浏览
134人参与
#
AI求职实录
#
4388次浏览
118人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
9097次浏览
209人参与
#
机械人春招想让哪家公司来捞你?
#
379418次浏览
3141人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
4213次浏览
143人参与
#
你的第一家实习公司是什么档次?
#
4762次浏览
76人参与
#
没关系,至少我的__很曼妙
#
4005次浏览
66人参与
#
赚钱的意义在这一刻具象化
#
4367次浏览
99人参与
#
你的landing期是如何度过的?
#
9293次浏览
177人参与
#
除了Java,最推荐学什么技术?
#
6539次浏览
157人参与
#
我发现了面试通关密码
#
1600418次浏览
19679人参与
#
一人一道大厂面试题
#
114213次浏览
1263人参与
#
你觉得什么岗位会被AI替代
#
37008次浏览
256人参与
#
你在职场上见过哪些“水货”同事
#
30875次浏览
168人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务