第二次面试
# go的几个web框架
beego,iris,gin,echo,revel
# 为什么Echo框架查找速度快
基于 radix tree (opens new window) ,Echo 的路由查询速度非常快。路由使用 sync pool (opens new window) 来重用内存,实现无 GC 开销下的零动态内存分配。
# 后端常用组件有哪些
- 统一请求入口-API网关(权限控制、安全、负载均衡、请求转发、监控)
- 统一认证中心(对 APP 用户、内部用户、APP 等的认证服务)
- 单点登录系统(只需要一次用户登录,就能够进入多个业务应用(权限可以不相同)。)
- 统一配置中心(统一对所有业务或者基础后端服务的相关配置文件进行管理的统一服务)
- 服务治理框架(对于外部 API 调用或者客户端对后端 API 的访问,可以使用 HTTP 协议或者 RESTful(当然也可以直接通过最原始的socket来调用)。但对于内部服务间的调用,一般都是通过 RPC 机制来调用的)
- 统一调度中心(对所有的调度任务进行管理,这样能够统一对调度集群进行调优、扩展、任务管理等(鼻比如定时抓取数据,定时刷新订单状态))
- 统一日志服务(使用单独的日志服务器记录日志,各个业务通过统一的日志框架将日志输出到日志服务器上)
- 缓存(通常被用来解决热点数据的访问问题,是提高数据查询性能的强大武器)
- 数据库(存储业务数据)
- 搜索引擎(针对全文检索以及数据各种维度查询设计的软件)
- 消息队列(用于传输数据,解决并发问题)
- 文件存储(要有可靠性,容灾性和稳定性,底层使用raid方案,底层使用分布式存储)
- 数据分析(用于分析各种数据)
- 故障监控(分为系统监控和业务监控)
# 为什么MongoDB读取速度比MySQL快
写操作MongoDB比传统数据库快的根本原因是Mongo使用的内存映射技术-写入数据时候只要在内存里完成就可以返回给应用程序,这样并发量自然就很高。而保存到硬体的操作则在后台异步完成。注意MongoDB在2.4就已经是默认安全写了(具体实现在驱动程序里),所以楼上有同学的回答说是”默认不安全“应该是基于2.2或之前版本的。
读操作MongoDB快的原因是:
MongoDB的设计要求你常用的数据(working set)可以在内存里装下。这样大部分操作只需要读内存,自然很快。
文档性模式设计一般会是的你所需要的数据都相对集中在一起(内存或硬盘),大家知道硬盘读写耗时最多是随机读写所产生的磁头定位时间,数据集中在一起则减少了关系性数据库需要从各个地方去把数据找过来(然后Join)所耗费的随机读时间
另外一个就是如@王子亭所提到的Mongo是分布式集群所以可以平行扩展。目前一般的百万次并发量都是通过几十上百个节点的集群同时实现。这一点MySQL基本无法做到(或者要花很大定制的代价)
mongo为什么比mysql快 - SegmentFault 思否 (opens new window)
# MySQL事务类型和隔离级别
事务类型和隔离级别参考:事务和锁 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)
# 数据库脏读和幻读
详细参考:事务和锁 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)
# 场景高效排序算法
堆排序,快速排序,归并排序
# 计算机网络七层协议
参考:体系结构 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)
# TCP和UDP的区别
参考:运输层(TCP,UDP) | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)
# Go context包
参考:并发编程 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)
# 动态数组扩容
(这里指o1时间用下标访问)
动态数组 是一种动态存储的线性表,所有元素的内存地址都是连续的。(我之前理解的是链表,实际上动态数组是线性表的。。。)
Go的扩容是不足1024的,双倍扩容,超过1024的,1.25倍扩容。
Java的ArrayList扩容是初始容量在Java 8中为10。当第11个数据需要添加时候,扩容1.5倍。这个1.5倍在ArrayList很巧妙,用了整数移位的方式。
# HTTP协议常见Header
参考:应用层(HTTP,SMTP) | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)
# 执行一段Go代码
自己居然还猜错了。。。。太傻了
2 1
1 3
2
说到底就是自己对底层理解还是太差了,自己想太多了。。。然后面试官第二个问题都没问。。。