2026年后端工程师面试题及数据库设计要点含答案_第1页
2026年后端工程师面试题及数据库设计要点含答案_第2页
2026年后端工程师面试题及数据库设计要点含答案_第3页
2026年后端工程师面试题及数据库设计要点含答案_第4页
2026年后端工程师面试题及数据库设计要点含答案_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年后端工程师面试题及数据库设计要点含答案一、编程题(共3题,每题20分)1.并发编程问题(20分)题目:假设有一个电商系统,用户下单时需要减少库存数量。请用Java实现一个线程安全的库存管理类,要求:1.使用synchronized关键字实现线程安全2.使用Lock接口实现线程安全3.比较两种方法的优缺点答案:java//1.使用synchronized关键字实现classStockSynchronized{privateintstock=100;publicsynchronizedbooleanpurchase(intnum){if(stock>=num){stock-=num;returntrue;}returnfalse;}publicintgetStock(){returnstock;}}//2.使用Lock接口实现importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classStockLock{privateintstock=100;privatefinalLocklock=newReentrantLock();publicbooleanpurchase(intnum){lock.lock();try{if(stock>=num){stock-=num;returntrue;}returnfalse;}finally{lock.unlock();}}publicintgetStock(){lock.lock();try{returnstock;}finally{lock.unlock();}}}//3.优缺点比较//synchronized://优点:简单易用,代码直观//缺点:可能导致线程阻塞时间长,不适合高并发场景//Lock://优点:提供更灵活的锁操作,可中断等待、可超时、可绑定多个条件变量//缺点:代码相对复杂,需要手动释放锁2.数据结构问题(20分)题目:设计一个LRU(LeastRecentlyUsed)缓存系统,要求:1.使用双向链表和哈希表实现2.支持get和put操作3.get操作返回值在链表中的节点,put操作时若键已存在则更新值并移动到头部答案:javaclassLRUCache{staticclassNode{intkey;intvalue;Nodeprev;Nodenext;Node(intkey,intvalue){this.key=key;this.value=value;}}privatefinalMap<Integer,Node>cache=newHashMap<>();privatefinalintcapacity;privatefinalNodehead=newNode(0,0);privatefinalNodetail=newNode(0,0);publicLRUCache(intcapacity){this.capacity=capacity;head.next=tail;tail.prev=head;}publicintget(intkey){Nodenode=cache.get(key);if(node==null)return-1;moveToHead(node);returnnode.value;}publicvoidput(intkey,intvalue){Nodenode=cache.get(key);if(node!=null){node.value=value;moveToHead(node);}else{NodenewNode=newNode(key,value);cache.put(key,newNode);addNode(newNode);if(cache.size()>capacity){NodetailPrev=removeTail();cache.remove(tailPrev.key);}}}privatevoidaddNode(Nodenode){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privatevoidremoveNode(Nodenode){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidmoveToHead(Nodenode){removeNode(node);addNode(node);}privateNoderemoveTail(){Noderes=tail.prev;removeNode(res);returnres;}}3.算法问题(20分)题目:给定一个包含n个点的坐标列表,找出距离原点(0,0)最近的K个点。要求:1.使用快速选择算法(QuickSelect)解决2.时间复杂度O(n)期望3.提供Java实现答案:javaclassSolution{publicint[][]kClosest(int[][]points,intK){intn=points.length;int[]dists=newint[n];for(inti=0;i<n;i++){dists[i]=points[i][0]points[i][0]+points[i][1]points[i][1];}quickSelect(dists,0,n-1,K);int[][]result=newint[K][2];for(inti=0;i<K;i++){result[i]=points[i];}returnresult;}privatevoidquickSelect(int[]dists,intstart,intend,intK){if(start>=end)return;intpivot=partition(dists,start,end);if(pivot==K-1)return;if(pivot>K-1){quickSelect(dists,start,pivot-1,K);}else{quickSelect(dists,pivot+1,end,K);}}privateintpartition(int[]dists,intstart,intend){intpivot=dists[end];inti=start-1;for(intj=start;j<end;j++){if(dists[j]<=pivot){i++;swap(dists,i,j);}}swap(dists,i+1,end);returni+1;}privatevoidswap(int[]dists,inti,intj){inttemp=dists[i];dists[i]=dists[j];dists[j]=temp;}}二、系统设计题(共2题,每题30分)1.微服务拆分设计(30分)题目:假设你现在需要为一个大型电商系统进行微服务拆分,请:1.描述拆分原则2.设计至少3个核心微服务及其职责3.说明服务间通信方式4.设计服务注册与发现机制答案:1.拆分原则:-业务领域原则:按业务领域进行拆分,每个服务只负责一个完整的业务能力-高内聚低耦合原则:服务内部高内聚,服务之间低耦合-独立部署原则:每个服务可以独立部署、扩展和升级-数据一致性原则:明确每个服务的数据库范围,保持数据一致性-容量弹性原则:每个服务应有独立的容量规划2.核心微服务设计:-商品服务(ProductService):职责:管理商品信息、分类、库存等功能:商品上架/下架、分类管理、库存查询/更新数据库:商品表、分类表、库存表-订单服务(OrderService):职责:管理订单生命周期功能:创建订单、支付处理、订单状态管理、取消订单数据库:订单表、订单项表、支付记录表-用户服务(UserService):职责:管理用户信息功能:用户注册/登录、个人信息管理、权限控制数据库:用户表、角色表、权限表3.服务间通信方式:-RPC通信:使用gRPC或RESTfulAPI进行服务间通信-消息队列:使用Kafka或RabbitMQ进行异步通信-API网关:所有外部请求通过API网关路由到对应服务-服务发现:服务间通过服务注册中心获取对方地址4.服务注册与发现机制:-使用Consul或Eureka作为服务注册中心-每个服务启动时自动注册到服务注册中心-服务提供者定期发送心跳保持注册状态-服务消费者从注册中心获取服务列表并实现负载均衡-实现服务熔断和降级机制以应对服务不可用情况2.高并发系统设计(30分)题目:设计一个支持百万级日活用户的秒杀系统,请:1.描述系统架构2.设计数据库表结构3.解决高并发瓶颈4.实现防刷单机制答案:1.系统架构:-前端入口:使用Nginx进行流量分发,实现静态资源分离和负载均衡-API网关:处理所有用户请求,实现认证、限流、路由功能-业务处理层:使用多个微服务处理不同业务逻辑-数据库层:使用读写分离和分库分表-缓存层:使用Redis集群缓存热点数据-消息队列:处理异步任务和系统间通信2.数据库表结构设计:秒杀商品表:createtableproduct_seckill(idbigintprimarykey,namevarchar(100),pricedecimal(10,2),stockint,start_timedatetime,end_timedatetime,statusint,create_timedatetimedefaultcurrent_timestamp);秒杀订单表:createtableseckill_order(idbigintprimarykey,user_idbigint,product_idbigint,serial_numvarchar(32),order_amountdecimal(10,2),statusint,create_timedatetimedefaultcurrent_timestamp,update_timedatetimedefaultcurrent_timestamponupdatecurrent_timestamp);用户秒杀记录表:createtableuser_seckill_record(idbigintprimarykey,user_idbigint,product_idbigint,countintdefault1,create_timedatetimedefaultcurrent_timestamp);3.解决高并发瓶颈:-使用Redis集群缓存商品信息和库存-实现本地缓存穿透策略-使用数据库乐观锁或分布式锁保证库存一致性-数据库读写分离,使用分库分表减少单表压力-使用异步处理和消息队列解耦系统-实现秒杀流量削峰,使用熔断和降级机制4.防刷单机制:-用户验证:验证用户手机号、邮箱等身份信息-IP限制:限制同一IP的请求频率-用户行为分析:识别异常行为模式-验证码机制:对可疑操作弹出验证码-序列号唯一性:每个订单分配唯一序列号-人脸识别:对高价值商品增加人脸识别验证-支付验证:确认支付后才能完成秒杀三、数据库设计题(共2题,每题25分)1.电商订单数据库设计(25分)题目:设计一个电商订单数据库,需要支持以下功能:1.订单创建、查询、修改、删除2.订单状态管理(待支付、已支付、已发货、已完成、已取消)3.订单商品关联4.支持分页查询5.考虑高并发场景下的性能优化答案:1.核心表设计:订单主表:createtableorders(idbigintprimarykey,user_idbigintnotnull,total_amountdecimal(12,2)notnull,payment_amountdecimal(12,2)notnull,statusintnotnull,create_timedatetimedefaultcurrent_timestamp,update_timedatetimedefaultcurrent_timestamponupdatecurrent_timestamp,versionintdefault0,foreignkey(user_id)referencesusers(id));订单项表:createtableorder_items(idbigintprimarykey,order_idbigintnotnull,product_idbigintnotnull,product_namevarchar(100)notnull,pricedecimal(10,2)notnull,quantityintnotnull,total_pricedecimal(12,2)notnull,foreignkey(order_id)referencesorders(id),foreignkey(product_id)referencesproducts(id));订单状态表:createtableorder_status(idintprimarykey,namevarchar(20)notnull,descriptionvarchar(100)notnull);初始化状态数据:insertintoorder_status(id,name,description)values(1,'待支付','订单已创建,待用户支付');insertintoorder_status(id,name,description)values(2,'已支付','用户已支付订单');insertintoorder_status(id,name,description)values(3,'已发货','商家已发货');insertintoorder_status(id,name,description)values(4,'已完成','订单已完成');insertintoorder_status(id,name,description)values(5,'已取消','订单已取消');2.性能优化:-订单表使用主从复制实现读写分离-使用分库分表策略分散订单数据压力-对订单状态字段建立索引-使用Redis缓存热点订单数据-实现本地缓存+分布式锁保证库存更新-使用数据库乐观锁处理订单状态更新-对订单查询进行SQL优化,避免全表扫描2.社交媒体数据库设计(25分)题目:设计一个社交媒体数据库,需要支持以下功能:1.用户注册、登录、信息管理2.文章发布、评论、点赞3.关注/粉丝关系4.消息推送5.考虑高并发场景下的数据一致性答案:1.核心表设计:用户表:createtableusers(idbigintprimarykey,usernamevarchar(50)uniquenotnull,passwordvarchar(255)notnull,nicknamevarchar(50)notnull,avatar_urlvarchar(255),genderint,birthdaydate,create_timedatetimedefaultcurrent_timestamp,update_timedatetimedefaultcurrent_timestamponupdatecurrent_timestamp);文章表:createtableposts(idbigintprimarykey,user_idbigintnotnull,titlevarchar(100)notnull,contenttextnotnull,content_htmltext,create_timedatetimedefaultcurrent_timestamp,update_timedatetimedefaultcurrent_timestamponupdatecurrent_timestamp,like_countintdefault0,comment_countintdefault0,view_countintdefault0,foreignkey(user_id)referencesusers(id));评论表:createtablecomments(idbigintprimarykey,post_idbigintnotnull,user_idbigintnotnull,contenttextnotnull,create_timedatetimedefaultcurrent_timestamp,update_timedatetimedefaul

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论