坐标上海,20~40K的面试强度

继续分享最新的面经,面试的岗位是上海某公司的Golang开发岗,给的薪资范围是20~40K,对mongodb要求熟练掌握,所以面试过程中对于mongodb也问的比较多。

下面是我整理好的面经(去除了项目相关的问题)

  1. 自我介绍?

2. mongodb查询优化讲一下?

可以从以下几个方面展开:

  1. 索引的使用

    • 索引是查询优化的核心。MongoDB支持多种索引类型(如单字段索引、复合索引、全文索引等)。合理创建索引可以显著提高查询性能。
    • 使用explain()方法分析查询计划,查看是否使用了索引以及索引的效率。
  2. 查询语句优化

    • 避免全表扫描:确保查询条件能够命中索引。
    • 尽量减少返回的数据量,使用projection只返回需要的字段。
    • 对于复杂的查询,可以通过拆分查询或使用聚合管道来优化。
  3. 分片与副本集

    • 分片可以将数据分布在多个节点上,从而提高查询性能。
    • 副本集主要用于高可用性,但读操作可以分担到从节点以减轻主节点的压力。
  4. 硬件和配置优化

    • 调整MongoDB的内存分配和缓存策略,充分利用服务器资源。
    • 定期监控数据库性能,使用工具如MongoDB Atlas或第三方监控工具定位瓶颈。
  5. 写操作优化

    • 批量写入比单条写入更高效。
    • 在高并发场景下,考虑调整写关注级别(Write Concern)以平衡性能和一致性。

3. mongodb和mysql的索引特性上有什么区别?

  1. 索引类型

    • MongoDB支持多种索引类型,包括单字段索引、复合索引、地理空间索引、全文索引和哈希索引。
    • MySQL主要支持B+树索引(InnoDB和MyISAM引擎),此外还有全文索引、哈希索引(Memory引擎)等。
  2. 索引存储结构

    • MongoDB默认使用B树作为索引结构,适合范围查询和排序。
    • MySQL的InnoDB引擎使用B+树,更适合范围查询和顺序访问。
  3. 索引覆盖

    • MongoDB支持索引覆盖查询(Index-Only Query),即如果查询的所有字段都在索引中,则无需访问文档本身。
    • MySQL同样支持索引覆盖,但需要确保查询字段完全包含在索引中。
  4. 唯一性约束

    • MongoDB允许在集合中创建唯一索引,但分布式环境下的唯一性约束需要额外注意。
    • MySQL的唯一索引在单机和分布式环境下都更容易实现。
  5. 性能影响

    • MongoDB的写操作会在写入文档的同时更新索引,可能会对性能产生一定影响。
    • MySQL的索引维护成本较高,尤其是在大规模更新或插入时。

4. mongodb设计索引上跟mysql有什么区别?

  1. 数据模型差异

    • MongoDB是文档型数据库,数据以嵌套的JSON格式存储,因此可以在嵌套字段上创建索引。
    • MySQL是关系型数据库,数据以表格形式存储,索引设计通常基于列。
  2. 复合索引的设计

    • MongoDB的复合索引顺序非常重要,查询条件必须按照索引定义的顺序匹配才能生效。
    • MySQL的复合索引也有顺序要求,但其查询优化器会尝试重排条件以匹配索引。
  3. 动态模式的支持

    • MongoDB支持动态模式,索引设计需要考虑文档结构的多样性。
    • MySQL的表结构是固定的,索引设计相对简单。
  4. 分布式环境

    • MongoDB的分片集群需要为分片键创建索引,且分片键的选择对性能有重大影响。
    • MySQL在分布式环境中通常通过中间件(如ShardingSphere)实现分片,索引设计不受分片键限制。
  5. 索引大小的考虑

    • MongoDB的索引存储在内存中,过大的索引可能导致性能下降。
    • MySQL的索引也占用内存,但其B+树结构更节省空间。

5. mongodb在创建索引和使用上有什么注意事项吗?

  1. 选择合适的字段

    • 根据查询频率和数据分布选择索引字段,避免为低频查询创建索引。
    • 复合索引的字段顺序应根据查询条件的重要性排列。
  2. 索引的维护成本

    • 创建索引会增加写操作的开销,因为每次写入都需要更新索引。
    • 删除不必要的索引以减少维护成本。
  3. 索引的覆盖能力

    • 尽量设计索引以支持覆盖查询,减少文档访问次数。
  4. 内存限制

    • 索引需要加载到内存中才能高效工作,因此索引大小不能超过可用内存。
  5. 后台创建

    • 在生产环境中创建索引时,建议使用后台模式(background: true),以避免阻塞其他操作。
  6. 分片集群的特殊要求

    • 分片集群需要为分片键创建索引,并确保分片键的选择均衡分布数据。

6. mongodb和mysql主键的区别?主键会带来什么影响?

  1. 主键的生成方式

    • MongoDB默认为主键字段_id生成一个唯一的ObjectId值,也可以自定义主键。
    • MySQL的主键通常由用户指定,或者由自增列(AUTO_INCREMENT)生成。
  2. 主键的作用

    • MongoDB的主键用于唯一标识文档,同时也是集合的默认索引。
    • MySQL的主键用于唯一标识行,同时是表的聚集索引(InnoDB引擎)。
  3. 性能影响

    • MongoDB的主键索引会影响查询和写入性能,尤其是当主键是随机生成的ObjectId时,可能导致频繁的页分裂。
    • MySQL的主键直接影响数据存储的物理顺序,连续递增的主键有助于提高插入性能。
  4. 分布式环境

    • MongoDB的主键在分片集群中需要结合分片键使用。
    • MySQL的主键在分布式环境中可能需要额外的协调机制。

7. kafka怎么保障kafka消息可靠性?

  1. 持久化

    • Kafka将消息持久化到磁盘,确保即使发生故障也能恢复数据。
    • 通过配置acks参数,可以控制消息的确认级别(如acks=1acks=all)。
  2. 副本机制

    • Kafka使用分区副本(Partition Replication)来保证数据的冗余。
    • ISR(In-Sync Replica)机制确保只有同步完成的副本才能参与选举。
  3. 消息确认

    • 生产者可以通过acks参数设置消息的确认级别,确保消息被成功写入。
  4. 消费者确认

    • 消费者通过手动提交偏移量(Offset)确保消息被正确处理。
  5. 事务支持

    • Kafka支持事务性消息,确保跨分区的消息一致性。

8. kafka怎么保证消息幂等?

  1. 生产者幂等性

    • Kafka引入了幂等性生产者(Idempotent Producer),通过为每个生产者分配唯一的PID(Producer ID)和序列号(Sequence Number)来确保每条消息只被写入一次。
  2. 事务支持

    • Kafka支持事务性消息,允许跨分区和主题的消息原子性提交。
  3. 消费者端处理

    • 消费者可以通过去重逻辑(如基于消息ID)避免重复处理。

9. 怎么限制goroutine的上限?

  1. 使用信号量(Semaphore)

    • 使用sync.WaitGroupchan struct{}实现信号量,限制并发goroutine的数量。
  2. 使用Worker Pool模式

    • 创建固定数量的worker goroutine,任务通过队列分发给这些worker。
  3. 使用第三方库

    • 使用类似ants这样的协程池库,直接设置最大goroutine数量。

10. sync.map的实现介绍一下?

sync.Map 是 Go 标准库中提供的一个并发安全的 map 实现,旨在优化高并发环境下的读写性能。它特别适合于读多写少的场景,并通过内部机制减少锁竞争来提高效率。

核心数据结构
  • read :这是一个只读缓存,包含一部分或全部的数据副本。它是无锁访问的,因此读操作非常快。

  • dirty :这是一个可写的缓存,包含了所有键值对(包括那些在 read 中没有但新添加的)。由于需要支持写入,访问 dirty 时会涉及到加锁操作。

  • entry :这是存储实际键值对的结构体。它支持原子操作,允许高效地更新或删除值而无需锁。

工作机制
  1. 读操作

    • 当进行读取时,优先从 read 中查找数据。因为 read 是无锁的,所以读取速度很快。
    • 如果 read 中找不到且有未迁移至 read 的数据,则检查 dirty。这时需要加锁,但这种情况相对较少。
  2. 写操作

    • 写入已存在的键值对时,尝试直接更新 read 中对应的条目。这通常可以通过原子操作完成,避免了加锁。
    • 对于新增的键值对,则会添加到 dirty 缓存中。如果 dirty 尚未初始化,会先将 read 中的数据复制到 dirty
  3. 数据迁移

    • 随着时间推移,dirty 可能积累大量未迁移到 read 的数据。当达到一定条件时,sync.Map 会触发一次数据迁移,将 dirty 提升为新的 read 并清空旧的 dirty
  4. 删除操作

    • 删除操作不是立即从 readdirty 中移除数据,而是标记相应的 entry 为已删除。这样可以延迟清理工作,减少内存分配和回收的开销。
适用场景
  • 读多写少:在这种情况下,sync.Map 的设计能够最大化利用其无锁读的优势。
  • 动态数据集:适用于键值对集合经常变化的应用场景。
  • 高并发环境:提供了一种高效的并发控制方式,减少了锁争用。
注意事项
  • 虽然 sync.Map 在读多写少的情况下表现优异,但在写密集型应用中可能不如使用传统同步方法(如手动加锁)那样有效。
  • 应谨慎评估你的应用场景是否适合使用 sync.Map,特别是当你预计会有大量的新键值对插入时。

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以私信我,备注:面试群。

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

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

相关文章

B端管理系统:企业运营的智慧大脑,精准指挥

B端管理系统的定义与核心功能 B端管理系统(Business Management System)是专门设计用于支持企业内部运作和外部业务交互的一套软件工具。它集成了多种功能模块,包括但不限于客户关系管理(CRM)、供应链管理(SCM)、人力资源管理(HRM)以及财务管…

IDE中使用Spring Data Redis

步骤一&#xff1a;导入Spring Data Redis的maven坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 步骤二&#xff1a;配置Redis数据源 步骤三&…

ARINC818协议的帧格式

SOFi:sof initiale;这个是第一个ADVB帧的SOF开始&#xff0c;一帧只有一个SOFi。 SOFn:sof normal;这个是非首个ADVB帧的SOF头的normal头。 Vsync为场同步&#xff0c;两个SOFi之间为Vsync信号&#xff0c;也就是一帧&#xff0c;也就是VS信号。 Hsync为行同步&#xff0c;如果…

Git核心命令

Git核心命令完全指南&#xff1a;从入门到高效协作 前言 在软件开发领域&#xff0c;Git已成为现代版本控制的代名词。据统计&#xff0c;全球超过90%的开发团队使用Git进行代码管理。然而&#xff0c;许多开发者仅停留在基础命令的机械使用层面&#xff0c;未能真正掌握Git命…

【计算机视觉】CV实战项目- Face-and-Emotion-Recognition 人脸情绪识别

Face-and-Emotion-Recognition 项目详细介绍 项目概述项目功能项目目录结构项目运行方式1. 环境准备2. 数据准备3. 模型训练4. 模型运行 常见问题及解决方法1. **安装依赖问题**2. **数据集问题**3. **模型训练问题**4. **模型运行问题** 项目实战建议项目参考文献 项目概述 F…

java lambda

案例1 lambda表达式看做成一个函数对象 方法引用 1.Math是类型&#xff0c;max是静态方法 2.Student是对象&#xff0c;getName是非静态方法 3.对象&#xff1a;&#xff1a;非静态方法 4.类型&#xff1a;&#xff1a;new关键字 练习1 假设已有对象 常见函数接口 predicate…

并发网路通信-套接字通信

套接字通信就是网络通信 在网络通信时,客户端和服务器的比例是N:1 服务器如何处理多个客户端的请求 并发处理方式 1.多线程并发处理->线程池并发处理,线程池可以对多个线程进行管理 2.多进程->进程池 3.io多路转接,使用select或者epoch进行处理,使用io转接函数…

AI当前状态:有哪些新技术

一、到目前为址AI领域出现的新技术 到目前为止&#xff0c;AI领域涌现了许多令人兴奋的新技术。以下是一些关键的进展&#xff0c;涵盖了从基础模型到实际应用的多个方面&#xff1a; 1. 更强大的大型语言模型 (LLMs): 性能提升: 新一代LLM&#xff0c;例如OpenAI的GPT-4o和…

AI与IT的共生

AI并非“职业终结者”&#xff0c;而是IT从业者的“认知杠杆”。通过工具化协作、技能升级与伦理治理&#xff0c;人类可释放创造力&#xff0c;探索量子计算、生物启发算法等深水区。未来的IT行业将呈现“AI赋能人类&#xff0c;人类定义AI边界”的共生格局。 一、AI如何改变…

swagger的简介及使用方法

Swagger 是一个用于描述、生成、文档化和测试 RESTful API 的开源工具集。它可以自动生成 API 文档&#xff0c;帮助开发者理解和使用 API。Swagger 由 Swagger.io 提供&#xff0c;并已经发展成了一套广泛应用于 API 设计和文档的标准。 Swagger 项目的历史可以追溯到 2010 年…

解决Flutter 2.10.5在升级Xcode 16后的各种报错

Flutter 环境 Flutter version 2.10.5Dart version 2.16.2DevTools version 2.9.2CocoaPods version 1.16.2Xcode 16.3 问题一&#xff1a;XCResult parsing error: Error: This command is deprecated and will be removed in a future release, --legacy flag is required t…

Vue + Spring Boot 整合全解析

一、引言 在当今的Web开发领域&#xff0c;前后端分离架构已成为主流。Vue.js作为一款流行的前端框架&#xff0c;以其简洁易用和高效的特点深受开发者喜爱&#xff1b;Spring Boot则是Java后端开发中快速构建应用的利器。将Vue和Spring Boot整合&#xff0c;能够充分发挥两者…

PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性

我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。 核心要点&#xff1a;PDF.js 本身主要是阅读器&#xff0c;不是编辑器 首先&#xff0c;最重要的一点是&#xff1a;PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染&#xf…

当HTTP遇到SQL注入:Java开发者的攻防实战手册

一、从HTTP请求到数据库查询:漏洞如何产生? 危险的参数拼接:Servlet中的经典错误 漏洞代码重现: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String category = request.getParameter("…

【grafana原生告警中心配置飞书机器人告警】

在grafana中的connect point中使用webhook的方式推送到飞书&#xff0c;始终无法触发告警&#xff0c;原因是grafana推送的格式飞书不识别&#xff0c;现有两种方式 1.使用中转服务 使用flask搭建一个服务&#xff0c;grafana告警先通过webhook发送到web服务中&#xff0c;格…

kafka集群认证

1、安装Kerberos(10.10.10.168) yum install krb5-server krb5-workstation krb5-libs -y ​ 查看版本 klist -V ​ Kerberos 5 version 1.20.1 ​ 编辑/etc/hosts 10.10.10.168 ms1 10.10.10.150 ms2 10.10.10.110 ms3 vim /etc/krb5.conf # Configuration snippets ma…

前端工程化之自动化测试

自动化测试 自动化测试为什么需要测试&#xff1f;什么时候需要考虑测试测试类型前端测试框架单元测试Jest 重点掌握项目示例package.jsonsrc/utils/math.tssrc/utils/math.test.ts进行测试jest.config.js覆盖率直观看覆盖率coverage/lcov-report/index.html src/main.test.tst…

分布式系统核心原理

CAP定理与权衡实践 CAP定理 一致性&#xff08;Consistency&#xff09; 强一致性&#xff1a;所有读写操作均基于最新数据&#xff08;如银行转账&#xff09;。 最终一致性&#xff1a;数据副本经过一段时间后达到一致&#xff08;如社交媒体的点赞数&#xff09;。 技术实现…

Step文件无法编辑怎么办?

Step文件无法编辑怎么办&#xff1f; 这里介绍两种方法&#xff0c; 1、 直接导入 准备step文件&#xff0c;solidworks导入后是这样&#xff0c;不能在上面直接编辑 图 1 点击右键&#xff0c;选择解除特征&#xff08;不同版本的可能不太一样&#xff0c;这里是solidworks2…

TIM_ITConfig() 和 TIM_Cmd()

在STM32的定时器中断配置中&#xff0c;TIM_ITConfig() 和 TIM_Cmd() 是两个关键函数&#xff0c;它们分别控制中断使能和定时器计数器的启停&#xff0c;作用层级不同。以下是详细解释&#xff1a; 1. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) 作用 启用定时器的特定中断…