原创

【有话说】2020 年 12 月某一天 15 个程序员远程视频“真实”面试,面试记录过程

2020年12月4日晚上,下班没有事情,大家临时想法组织次远程视频,模拟真实场景下的面试,有人踊跃报名充当面试者,而小编就是面试官,大概还有十四五六个旁听的“观众”,一直持续了一个多小时吧,大概情况就是这样子。

面试问题及答案

1、sql左右连接的区别
select * from goods left/right join user on goods.user_id = user.id
左连接的查询结果是:左表(goods)的所有数据加上 右表(user) on 后面条件符合的数据,(左全右包)
右连接的查询结果是:右边(user)的所有数据加上左边(goods) on 后面条件符合的数据,(左包右全)
2、hashMap hashtable的区别
1)线程安全性不同 hashMap 线程不安全,因为底层的方法没有synchronized关键字 hashtable 是线程安全的
2)hashMap允许空键值对 key value ,key不可重复,所以只可以为一次空,value可以为空, hashtable不允许空键值对
3)初始容量和扩容机制不同, hashtable初始容量为11,hashMap初始容量为16(1.8改为),hashtable底层不要求容量必须是2的整数次幂,hashMap要求扩容机制,hashtable扩容是将容量扩容到原来的2倍+1 hashMap扩容是将容量扩容到原来的2倍
4)底层hashtable比hashMap多了一个 contains方法 hashtable有contains、containsKey、containsValue
hashMap底层只有containsKey、containsValue方法,( hashtable的 contains方法和 containsValue方法相同 )
5)hashtable没有驼峰式命名~
3、error exption 的区别
Error:程序无法处理的系统错误,编译器不做检查。
Expection:程序可以处理的异常,捕捉后可能恢复。
Error是程序无法处理的错误,后者是可以处理的异常,Error属于JVM需要承担的责任,Exception 分为RuntimeException 是程序应该承担的责任,CheckedException可检查异常时JAVA编译器应该承担的责任
4、框架如何线程安全?
没思路,查资料也没看懂,是不是记错了问题
5、抽象类和接口的区别
1)语法区别:
关键字 接口interface  抽象类abstract 
实现 接口 implements 抽象类 实现 extends
2)接口强调特定功能的实现,抽象类强调所属关系
3)接口只有定义,不能有方法的实现(java8后可以定义default方法体)。抽象类可以有定义,有实现,方法可以在抽象类中实现
4)接口成员变量默认为public static final ,必须赋初值,不能被修改,接口的方法都是public abstract 的。抽象类中成员默认default 可在子类中重写,也可以被重新赋值,修改。抽象方法被abstract修饰 必须以分号结尾不带{}
6、redis 结构 持久化 缓存雪崩等问题 哨兵 集群
Remote Dictionary Server 远程字典服务
redis五大数据结构: String Hash List Set无序 Zset有序
持久化 RDB(Redis DataBase) 和 AOF(Append Only File[仅追加文件])
持久化过程:客服端->服务端->write->缓冲区[转移]->磁盘控制器->磁盘
redis宕机 只要写到缓冲区之后的都可以完成持久化保存
RDB机制:把数据以快照的形式保存在磁盘上,类似把这一刻的数据拍成照片。是指在指定的时间间隔内将内存中的数据集快照写入磁盘。默认持久化方式。这种方  式就是将内存中的数据以快照的方式写入二进制文件中,默认文件名为dump.rdb。
快照有三种触发机制:
1)save触发方式 该命令会阻塞redis服务器 执行save不能处理其他命令,直到RDB过程完成为止。
2)bgsave触发方式 该命令会在后台异步进行快照操作,redis进程执行fork操作创建子进程,持久化由子进程操作,完成后自动结束。阻塞只发生在fork阶段,时间很短。基本上redis内部所有RDB操作都是采用bgsave命令(fork消耗内存)
3)自动触发 在redis.conf配置文件中配置
优势
1)文件紧凑,全量备份,非常适合备份和灾难恢复
2)fork子进程处理保存工作,主进程不需要进行磁盘io操作
3)恢复大数据集时的速度比aof恢复速度要快
劣势:开启子进程负责持久化后,父进程修改内存数据子进程不会反应过来,在快照持久化期间修改的数据可能会丢失
AOF机制:全量备份总是耗时的,高效的方式AOF
工作机制:redis会将每一个收到的命令通过write函数追加到文件中
(日志记录),没当有一个写命令过来时,就直接保存到AOF中
AOF方式带来另一个问题:持久化文件会越来越大。为了压缩AOF的持久化文件 ,redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程将文件重写
重写aof没有读取旧的aof文件,而是以类似快照的方式将内存中的书库以命令的方式重写了一个aof文件
aof的三种触发机制
1)always   同步持久化 每次发生数据变更会被立即记录到磁盘,性能差但数据完成性比较好(io开销大)
2)everysec  异步操作,每秒记录,但如果一秒内宕机,有数据丢失
3)no 从不同步(不可控)
AOF优势:
1)可以更好的保护数据不丢失,一般会每隔一秒后台执行一次异步操作,最多丢失一秒数据。
2)aof日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损,过大也可后台重写操作,不会影响客户端的重写。不是二进制,可读性很好,出现flushall命令,立即拷贝aof文件删除flushall命令再将aof文件放回即可恢复所有数据
缺点:aof文件通常比RDB数据快照文件更大,据说以前发生过bug,通过AOF记录的日志,进行数据恢复,没有恢复出一模一样的数据
7、mysql主从复制
原理:
1)master服务器会将数据的改变记录二进制binlog日志,当master数据发生改变时,将其写入二进制文件
2)slave服务器会在一定时间间隔内对master二进制日志文件进行探测是否发生改变,如果发生改变, 则开始IOThread请求master二进制事件
 3)主节点每个IO线程启动一个dump线程 用于发送二进制事件,并保存到从节点本地的中继日志中,从节点将启动sql线程从中继日志中读取二进制日志,在本地重放,使得数据保持一致,最后IO和SQL线程休眠等待下一次唤醒
8、购物车实现 及所用到的技术    项目略
9、有效订单无效订单 业务层面的问题  项目略 
10、session共享 单点登录   项目略
11、如何插入一百万条数据插入的快
1)使用insert  select 语句批量插入
2)定义存储过程在server端操作
3)insert into 表名 (字段) values(第一条),(第二条...)

4)创建两个表 一个内存表 一个数据表 先存入内存表再存入数据表

~阅读全文~人机检测~

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

您可能感兴趣的文章

评论

分享:

支付宝

微信