首页 » 排名链接 » 上岸拼多多了!月薪4w!附带面试题和答案!(进程线程模式上岸数据)

上岸拼多多了!月薪4w!附带面试题和答案!(进程线程模式上岸数据)

雨夜梧桐 2024-11-02 16:08:05 0

扫一扫用手机浏览

文章目录 [+]

今天分享的是一个小伙伴上岸拼多多的经历:

1,本科学历聊城大学,硕士重邮,都是双非。

2,参加过蓝桥杯和数学建模大赛。

上岸拼多多了!月薪4w!附带面试题和答案!(进程线程模式上岸数据) 排名链接
(图片来自网络侵删)

3,认真准备面试5个月,学习了小孟的四个项目。

下面是他的一些的面试题,我整理了下答案:

有哪些SQL优化策略?

1.1 优化 COUNT 查询

COUNT 的另⼀个作⽤是统计结果集的⾏数,当使⽤ COUNT() 时, 不会扩展成所有列,它会忽略所有的列⽽直接统计所有的⾏数。

但是某些业务不需要count值,用这个太浪费了,可以用explain替换,执行EXPLAIN 并不需要真正地执⾏查询。

1.2 优化关联查询

确保 ON 或 USING ⼦句中的列上有索引,在创建索引时就要考虑到关联的顺序。

如果在 MySQL 5.5 及以下版本尽量避免⼦查询,可以⽤关联查询代替。

1.3 优化limit分页

可以要么在页面中限制页的数量,要么是优化大偏移量的性能。
最好的方法是尽可能地使用覆盖索引扫描,而不是查询所有的列,然后根据需要做⼀次关联操作再返回所需的列。

1.4 优化 UNION 查询

尽量使用UNION ALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,这会导致对整个临时表的数据做唯⼀性检查,这样做的代价非常高,得不偿失。

其他还有非常多的优化技巧,可以再多说几条。

进程和线程的区别是什么

线程是进程中执行运算的最小单位,是进程中的一个实体。

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。

线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器。

进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率。

由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销。

线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆、栈。

主线程的重要性体现在两个方面:

它是产生其他子线程的线程。

通常它必须最后完成执行,因为它执行各种关闭动作。

如何合并两个有序链表?

思路:首先,我们设定一个哨兵节点 dum,这可以在最后让我们比较容易地返回合并后的链表。
我们维护一个 cur 指针,我们需要做的是调整它的 next 指针。
然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 cur 节点的后面同时将 l1 指针往后移一位。
否则,我们对 l2 做同样的操作。
不管我们将哪一个元素接在了后面,我们都需要把 cur 向后移一位。

在循环终止的时候,l1 和 l2 至多有一个是非空的。
由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。
这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
注意最后返回的是 dum.next

代码实现:

直接选择排序的原理是什么?

每次在未排序序列中找到最小元素,和未排序序列的第⼀个元素交换位置,再在剩余未排序序列中重复 该操作直到所有元素排序完毕。

说下Hash实现的原理?

1)HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。

2)当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。

3)当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。
当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

介绍下你的项目,通过什么技术解决了什么问题?

使用分布式Seesion,可以实现让多台服务器同时可以响应。

使用redis做缓存提高访问速度和并发量,减少数据库压力,利用内存标记减少redis的访问。

使用页面静态化,加快用户访问速度,提高QPS,缓存页面至浏览器,前后端分离降低服务器压力。

使用消息队列完成异步下单,提升用户体验,削峰和降流。

安全性优化:双重md5密码校验,秒杀接口地址的隐藏,接口限流防刷,数学公式验证码。

Spring中用到了哪些设计模式?

工厂模式:Spring通过BeanFactory和ApplicationContext实现对象的创建。
BeanFactory是Spring中最基础的容器,提供了最基本的依赖注入支持;而ApplicationContext是基于BeanFactory之上构建的,提供了更多企业级功能。

单例模式:在Spring中,默认bean的作用域是singleton,这意味着每个bean在Spring IoC容器中只有一个共享实例。
这是通过使用ConcurrentHashMap维护单例注册表来实现的。

原型模式:与单例模式相对应,原型(prototype)作用域的bean每次请求都会创建一个新的实例,确保每个请求获得的是全新的对象副本。

代理模式:Spring广泛使用Java动态代理和CGLib来创建对象的代理,以实现诸如事务管理、权限检查等功能。

观察者模式:在Spring中,观察者模式可用于实现事件发布和监听机制,例如ApplicationListener用于监听应用程序上下文的事件。

适配器模式:Spring MVC中的Controller接口可以看作是适配器模式的一个应用,它允许将不同类型的请求处理逻辑适配到统一的接口下。

Spring框架通过运用多种设计模式,实现了代码的低耦合、高扩展性,并简化了开发过程。

设计模式,我们已经开源过完美的教程:

https://www.bilibili.com/video/BV1o441157xk/?spm_id_from=333.999.0.0

说说TCP3次握手的过程?为啥不4次呢?

第一次握手:客户端发送一个带有SYN标志的TCP段给服务器,询问它是否愿意建立连接。
此段包含一个随机的序列号seq,这是TCP报文的初始序列号。

第二次握手:服务器以一个既确认客户端的SYN(ACK标志位为1),又对客户端发起自己的SYN进行响应的TCP段回复。
这个段中的确认序号ack设置为客户端初始序列号加1(即seq+1),同时服务器也会设置自己的初始序列号在TCP段中。

第三次握手:客户端收到服务器的SYN-ACK报文后,会发送一个ACK报文回复服务器,确认号码ack设置为服务器的初始序列号加1(即服务器的seq+1)。

如果只有两次,无法做到双向连接的建立,从建立连接server回复的SYN和ACK合并成一次可以看出来,他也不需要4次。

三次握手确保了双方都有能力进行数据的发送和接收,这是通过第二次和第三次握手中双方分别确认对方的SYN和ACK消息来实现的。

TCP的三次握手过程是经过精心设计的,旨在确保连接的可靠性和安全性。

mysql主从同步的步骤是什么?

安装与配置

安装数据库

主数据库配置:在主库的配置文件my.cnf中设置server_id,开启并配置binlog相关参数,如log_bin, binlog_format, max_binlog_size等。

从数据库配置:在从库的配置文件中也需要设置server_id,并配置相关的复制参数,如relay_log_recovery, log_slave_updates等。

创建同步用户

锁定主库表:为了确保数据的一致性,需要先锁定主库的表,防止在备份过程中数据被修改。

备份数据:使用mysqldump工具备份需要同步的数据库。

导入到从库:在从库创建相应的数据库并导入备份数据。

设置同步信息

获取主库状态:通过show master status命令获取主库的二进制日志文件名和位置。

配置从库:在从库上设置主库的信息,包括master_host, master_user, master_password, master_log_file, master_log_pos等,然后启动从服务。

检查同步状态

查看同步状态:通过show slave status\G;命令检查从库的同步状态,确认Slave_IO_Running和Slave_SQL_Running状态均为Yes。

解锁主库表

解锁主库表:确认从库已经开始同步后,可以解锁主库的表,允许数据写入。

解决不同步问题

处理错误:如果发现主从数据不同步,可以通过设置sql_slave_skip_counter来跳过错误,或者重新进行数据同步。

我是程序员小孟,欢迎点赞关注。
有问题可以评论区交流!
@程序员springmeng

标签:

相关文章