【有话说2020 年 12 月某一天 15 个程序员远程视频“真实”面试,面试记录过程】历览千载书,时时见遗烈。这篇文章主要讲述有话说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、containsValuehashMap底层只有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 抽象类 实现 extends2)接口强调特定功能的实现,抽象类强调所属关系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)创建两个表 一个内存表 一个数据表 先存入内存表再存入数据表
推荐阅读
- 进程的优先级
- 手动生成kubeadm token用于加入新的worker节点
- linux 修改home 目录
- Linux下如何安转JDK
- 高可用之弹性伸缩
- 8个办公小技巧分享给你!1分钟学会让你每天节约30分钟!
- Redis事务和乐观锁原理详解
- “隐形空中接口”空中显示和输入设备
- k8s部署-54-如何完善k8s中Prometheus(普罗米修斯)监控项目呢(本文带你了解)