一个月挺近大厂,这份六脉神剑面试大总结真的牛掰

2023-11-05 03:50

本文主要是介绍一个月挺近大厂,这份六脉神剑面试大总结真的牛掰,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

  • 前言
    • 🚀 1.Java篇
      • 🌈 1.1 Java语言有哪些特点?
      • 🌈 1.2 Java有哪些数据类型?
      • 🌈 1.3 讲讲面向对象三大特性?
      • 🌈 1.4 重载(Overload)和重写(Override)的区别是什么?
      • 🌈 1.5 Java常见的集合有哪些?
      • 🌈 1.6 什么是线程死锁?如何避免死锁?
    • 🚀 2.MySQL篇
      • 🌈 2.1 数据库三大范式是什么?
      • 🌈 2.2 事务的四大特性(ACID)介绍一下?
      • 🌈 2.3 SQL语句主要分为哪几类?
      • 🌈 2.4 MySQL分库分表的目的是?
      • 🌈 2.5 什么是MySQL的GTID?
      • 🌈 2.6 MySQL常用的备份工具有哪些?
    • 🚀 3.MyBatis篇
      • 🌈 3.1 MyBatis是什么?
      • 🌈 3.2 Mybaits的优缺点
      • 🌈 3.3 Hibernate 和 MyBatis 的区别
      • 🌈 3.4 MyBatis是如何解决JDBC编程的?
      • 🌈 3.5 在Mapper中如何传递多个参数?
      • 🌈 3.6 Mybatis有哪些动态sql?
    • 🚀 4.Linux篇
      • 🌈 4.1 什么是 Linux 内核?
      • 🌈 4.2 请阐述Linux 的体系结构
      • 🌈 4.3 Linux 开机启动过程?
      • 🌈 4.4 Linux 的目录结构是怎样的?
      • 🌈 4.5 什么是硬链接和软链接?
      • 🌈 4.6 Linux 性能调优都有哪几种方法?
    • 🚀 5.Redis篇
      • 🌈 5.1 Redis 在项目中的使用场景
      • 🌈 5.2 Redis 常见的数据结构
      • 🌈 5.3 Redis 的内存淘汰(驱逐)策略
      • 🌈 5.4 Redis 删除过期键的策略有哪些?
      • 🌈 5.5 Redis集群模式具备的特点?
      • 🌈 5.6 Redis 事务是怎么实现的?
    • 🚀 6.计算机网络篇
      • 🌈 6.1 IP地址的分类有哪些?
      • 🌈 6.2 简单阐述下各种协议
      • 🌈 6.3 DNS域名系统,简单描述其工作原理
      • 🌈 6.4 什么是网关,有什么作用?
      • 🌈 6.5 阐述下路由器的作用
      • 🌈 6.6 TCP的三次握手过程?

前言

我要跳槽,我要把握这个时机,本文总结了面试中的经典问题,分享给大家,如能掌握相信定能助你在对线大厂面试官时不落下风

🚀 1.Java篇

🌈 1.1 Java语言有哪些特点?

1.面向对象(封装,继承,多态);
2.平台无关性,平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
3.可靠性、安全性;
4.支持多线程。C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持;
5.支持网络编程并且很方便。Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便;
6.编译与解释并存;

🌈 1.2 Java有哪些数据类型?

Java 语言的数据类型分为两种:基本数据类型和引用数据类型。

在这里插入图片描述

🚩🚩 1.基本数据类型
包括 boolean(布尔型)、float(单精度浮点型)、char(字符型)、byte(字节型)、short(短整型)、int(整型)、long(长整型)和 double (双精度浮点型)共 8 种,如下表所示。

在这里插入图片描述

🚩🚩 2.引用数据类型
建立在基本数据类型的基础上,包括数组、类和接口。
引用数据类型是由用户自定义,用来限制其他数据的类型。
另外,Java 语言中不支持 C++中的指针类型、结构类型、联合类型和枚举类型。

🌈 1.3 讲讲面向对象三大特性?

首选我们看下面向对象和过程的区别
在这里插入图片描述

🚩 封装
封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
🚩继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
🚩多态性
它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

🌈 1.4 重载(Overload)和重写(Override)的区别是什么?

方法的重载和重写都是实现多态的方式,
区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重写发生在子类与父类之间, 重写方法返回值和形参都不能改变,与方法返回值和访问修饰符无关,
即重载的方法不能根据返回类型进行区分。即外壳不变,核心重写!
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。

在这里插入图片描述

🌈 1.5 Java常见的集合有哪些?

Java集合类主要由两个根接口Collection和Map派生出来的,
Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),
因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。
注意:Collection是一个接口,Collections是一个工具类,Map不是Collection的子接口。

🚩🚩 Java集合框架图如下:
在这里插入图片描述

图中,List代表了有序可重复集合,可直接根据元素的索引来访问;
Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合。
Map代表的是存储key-value对的集合,可根据元素的key来访问value。
上图中淡绿色背景覆盖的是集合体系中常用的实现类,
分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等实现类。

🌈 1.6 什么是线程死锁?如何避免死锁?

死锁
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。
由于线程被无限期地阻塞,因此程序不可能正常终止
死锁必须具备以下四个条件:
1.互斥条件:该资源任意一个时刻只由一个线程占用。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:线程已获得的资源在末使用完之前不能被其他线程强行剥夺,
只有自己使用完毕后才释放资源。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

在这里插入图片描述

如何避免线程死锁?
只要破坏产生死锁的四个条件中的其中一个就可以了
1.破坏互斥条件 这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)
2.破坏请求与保持条件 一次性申请所有的资源。
3.破坏不剥夺条件 占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
4.破坏循环等待条件 靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。
锁排序法:(必须回答出来的点) 指定获取锁的顺序,比如某个线程只有获得A锁和B锁,
才能对某资源进行操作,在多线程条件下,如何避免死锁? 通过指定锁的获取顺序,
比如规定,只有获得A锁的线程才有资格获取B锁,按顺序获取锁就可以避免死锁。
这通常被认为是解决死锁很好的一种方法。
5.使用显式锁中的ReentrantLock.try(long,TimeUnit)来申请锁

🚀 2.MySQL篇

🌈 2.1 数据库三大范式是什么?

第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。
比如性能。事实上我们经常会为了性能而妥协数据库的设计。

🌈 2.2 事务的四大特性(ACID)介绍一下?

在这里插入图片描述

原子性:事务是最小的执行单位,不允许分割。
事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,
各并发事务之间数据库是独立的;
持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,
即使数据库发生故障也不应该对其有任何影响。

🌈 2.3 SQL语句主要分为哪几类?

数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER
主要为以上操作 即对逻辑结构等有操作的,
其中包括表结构,视图和索引。
数据查询语言DQL(Data Query Language)SELECT
这个较为好理解 即查询操作,以select关键字。
各种简单查询,连接查询等 都属于DQL。
数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE,DELETE
主要为以上操作 即对数据进行操作的,
对应上面所说的查询操作 DQL与DML共同构建了多数初级程序员常用的增删改查操作。
而查询是较为特殊的一种 被划分到DQL中。
数据控制功能DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK
主要为以上操作 即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。

🌈 2.4 MySQL分库分表的目的是?

分库分表就是为了 解决由于数据量过大而导致数据库性能降低的问题,
将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,
使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
分库分表常用的中间件如下:

在这里插入图片描述

🌈 2.5 什么是MySQL的GTID?

TID(Global Transaction ID,全局事务ID)是全局事务标识符,
是一个已提交事务的编号,并且是一个全局唯一的编号。
GTID是从MySQL 5.6版本开始在主从复制方面推出的重量级特性。
GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。
GTID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
GTID有如下几点作用:
① 根据GTID可以知道事务最初是在哪个实例上提交的。
② GTID的存在方便了Replication的Failover。
因为不用像传统模式复制那样去找master_log_file和master_log_pos。
③ 基于GTID搭建主从复制更加简单,
确保每个事务只会被执行一次。

🌈 2.6 MySQL常用的备份工具有哪些?

常用备份工具mysql复制
逻辑备份(mysqldump,mydumper)
物理备份(copy,xtrabackup)
备份工具差异对比
1.mysql复制相对于其他的备份来说,得到的备份数据比较实时。
2.逻辑备份:分表比较容易。
mysqldump备份数据时是将所有sql语句整合在同一个文件中;
mydumper备份数据时是将SQL语句按照表拆分成单个的sql文件,
每个sql文件对应一个完整的表。
3.物理备份:拷贝即可用,速度快。
copy:直接拷贝文件到数据目录下,可能引起表损坏或者数据不一致。
xtrabackup对于innodb表是不需要锁表的,对于myisam表仍然需要锁表。

🚀 3.MyBatis篇

🌈 3.1 MyBatis是什么?

Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,
可以严格控制sql执行性能,灵活度高。
作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,
将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
由于MyBatis专注于SQL本身,灵活度高,所以比较适合对性能的要求很高,
或者需求变化较多的项目,如互联网项目。

在这里插入图片描述

🌈 3.2 Mybaits的优缺点

🚩🚩 优点:
基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,
SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。能够与Spring很好的集成;提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

🚩🚩 缺点:
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

🌈 3.3 Hibernate 和 MyBatis 的区别

相同点:都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。
不同点
1、映射关系
MyBatis 是一个半自动映射的框架,配置Java对象与sql语句执行结果的对应关系,多表关联关系配置简单。
Hibernate 是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂。
2、 SQL优化和移植性
Hibernate 对SQL语句封装,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)操作数据库,数据库无关性支持好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。 MyBatis 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但sql语句优化容易。
3、开发难易程度和学习成本
Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,
比如:办公自动化系统
MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目,
比如:互联网电子商务系统
🚩🚩 总结
MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,
Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

🌈 3.4 MyBatis是如何解决JDBC编程的?

1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,
如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,
占位符需要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句。
4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,
如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。

🌈 3.5 在Mapper中如何传递多个参数?

1、若Dao层函数有多个参数,那么其对应的xml中,#{0}代表接收的是Dao层中的第一个参数,
#{1}代表Dao中的第二个参数,以此类推。
2、使用@Param注解:在Dao层的参数中前加@Param注解,
注解内的参数名为传递到Mapper中的参数名。
3、多个参数封装成Map,以HashMap的形式传递到Mapper中。

🌈 3.6 Mybatis有哪些动态sql?

Mybatis动态sql可以在xml映射文件内,以标签的形式编写动态sql,
执行原理是根据表达式的值完成逻辑判断,并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:
trim、where、set、foreach、if、choose、when、otherwise、bind

🚀 4.Linux篇

🌈 4.1 什么是 Linux 内核?

Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,
在必要时分配硬件,并根据需要执行软件。
系统内存管理
应用程序管理
硬件设备管理
文件系统管理

🌈 4.2 请阐述Linux 的体系结构

从大的方面讲,Linux 体系结构可以分为两块:

在这里插入图片描述

a.用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library) 。
b.内核空间(Kernel Space) :内核空间又包括系统调用接口(System Call Interface)、内核(Kernel)、平台架构相关的代码(Architecture-Dependent Kernel Code) 。

🌈 4.3 Linux 开机启动过程?

1、主机加电自检,加载 BIOS 硬件信息。
2、读取 MBR 的引导文件(GRUB、LILO)。
3、引导 Linux 内核。
4、运行第一个进程 init (进程号永远为 1 )。
5、进入相应的运行级别。
6、运行终端,输入用户名和密码。

🌈 4.4 Linux 的目录结构是怎样的?

Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录
常见目录说明:

在这里插入图片描述

/bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里;
/etc: 存放系统管理和配置文件;
/home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示;
**/usr **: 用于存放系统应用程序;
/opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;
/proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
/root: 超级用户(系统管理员)的主目录(特权阶级o);
/sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;
/dev: 用于存放设备文件;
/mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
/boot: 存放用于系统引导时使用的各种文件;
**/lib **: 存放着和系统运行相关的库文件 ;
/tmp: 用于存放各种临时文件,是公用的临时文件存储点;
/var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
/lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。

🌈 4.5 什么是硬链接和软链接?

1)硬链接
由于 Linux 下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。
不足:
1)不可以在不同文件系统的文件间建立链接;2)只有超级用户才可以为目录创建硬链接。
2)软链接
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
不足:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
实际场景下,基本是使用软链接。总结区别如下:
硬链接不可以跨分区,软件链可以跨分区。
硬链接指向一个 inode 节点,而软链接则是创建一个新的 inode 节点。
删除硬链接文件,不会删除原文件,删除软链接文件,会把原文件删除。

🌈 4.6 Linux 性能调优都有哪几种方法?

1、Disabling daemons (关闭 daemons)。
2、Shutting down the GUI (关闭 GUI)。
3、Changing kernel parameters (改变内核参数)。
4、Kernel parameters (内核参数)。
5、Tuning the processor subsystem (处理器子系统调优)。
6、Tuning the memory subsystem (内存子系统调优)。
7、Tuning the file system (文件系统子系统调优)。
8、Tuning the network subsystem(网络子系统调优)。

🚀 5.Redis篇

🌈 5.1 Redis 在项目中的使用场景

缓存(核心)、分布式锁(set + lua 脚本)、排行榜(zset)、计数(incrby)、消息队列(stream)、地理位置(geo)、访客统计(hyperloglog)等。

🌈 5.2 Redis 常见的数据结构

基础的5种:
String:字符串,最基础的数据类型。
List:列表。
Hash:哈希对象。
Set:集合。
Sorted Set:有序集合,Set 的基础上加了个分值。

高级的4种:
HyperLogLog:通常用于基数统计。使用少量固定大小的内存,来统计集合中唯一元素的数量。统计结果不是精确值,而是一个带有0.81%标准差(standard error)的近似值。所以,HyperLogLog适用于一些对于统计结果精确度要求不是特别高的场景,例如网站的UV统计。
Geo:redis 3.2 版本的新特性。可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作:获取2个位置的距离、根据给定地理位置坐标获取指定范围内的地理位置集合。
Bitmap:位图。
Stream:主要用于消息队列,类似于 kafka,可以认为是 pub/sub 的改进版。提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

🌈 5.3 Redis 的内存淘汰(驱逐)策略

当 redis 的内存空间(maxmemory 参数配置)已经用满时,
redis 将根据配置的驱逐策略(maxmemory-policy 参数配置),进行相应的动作。
网上很多资料都是写 6 种,但是其实当前 redis 的淘汰策略已经有 8 种了,
多余的两种是 Redis 4.0 新增的,基于 LFU(Least Frequently Used)算法实现的。
noeviction:默认策略,不淘汰任何 key,直接返回错误
allkeys-lru:在所有的 key 中,使用 LRU 算法淘汰部分 key
allkeys-lfu:在所有的 key 中,使用 LFU 算法淘汰部分 key,该算法于 Redis 4.0 新增
allkeys-random:在所有的 key 中,随机淘汰部分 key
volatile-lru:在设置了过期时间的 key 中,使用 LRU 算法淘汰部分 key
volatile-lfu:在设置了过期时间的 key 中,使用 LFU 算法淘汰部分 key,该算法于 Redis 4.0 新增
volatile-random:在设置了过期时间的 key 中,随机淘汰部分 key
volatile-ttl:在设置了过期时间的 key 中,挑选 TTL(time to live,剩余时间)短的 key 淘汰

🌈 5.4 Redis 删除过期键的策略有哪些?

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。对内存最友好,对 CPU 时间最不友好。
惰性删除:放任键过期不管,但是每次获取键时,都检査键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。对 CPU 时间最优化,对内存最不友好。
定期删除:每隔一段时间,默认100ms,程序就对数据库进行一次检査,删除里面的过期键。至 于要删除多少过期键,以及要检査多少个数据库,则由算法决定。前两种策略的折中,对 CPU 时间和内存的友好程度较平衡。
Redis 使用惰性删除和定期删除。

🌈 5.5 Redis集群模式具备的特点?

采取去中心化的集群模式,将数据按槽存储分布在多个 Redis 节点上。集群共有 16384 个槽,每个节点负责处理部分槽。
使用 CRC16 算法来计算 key 所属的槽:crc16(key,keylen) & 16383。
所有的 Redis 节点彼此互联,通过 PING-PONG 机制来进行节点间的心跳检测。
分片内采用一主多从保证高可用,并提供复制和故障恢复功能。在实际使用中,通常会将主从分布在不同机房,避免机房出现故障导致整个分片出问题,下面的架构图就是这样设计的。
客户端与 Redis 节点直连,不需要中间代理层(proxy)。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

集群的架构图如下所示:

在这里插入图片描述

🌈 5.6 Redis 事务是怎么实现的?

一个事务从开始到结束通常会经历以下3个阶段:
1)事务开始:multi 命令将执行该命令的客户端从非事务状态切换至事务状态,底层通过 flags 属性标识。
2)命令入队:当客户端处于事务状态时,服务器会根据客户端发来的命令执行不同的操作:
exec、discard、watch、multi 命令会被立即执行
其他命令不会立即执行,而是将命令放入到一个事务队列,然后向客户端返回 QUEUED 回复。
3)事务执行:当一个处于事务状态的客户端向服务器发送 exec 命令时,服务器会遍历事务队列,执行队列中的所有命令,最后将结果全部返回给客户端。
不过 redis 的事务并不推荐在实际中使用,如果要使用事务,推荐使用 Lua 脚本,redis 会保证一个 Lua 脚本里的所有命令的原子性。

🚀 6.计算机网络篇

🌈 6.1 IP地址的分类有哪些?

A类地址:以0开头, 第一个字节范围:0~126(1.0.0.0 - 126.255.255.255);
B类地址:以10开头, 第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);
C类地址:以110开头, 第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);
10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。(Internet上保留地址用于内部)IP地址与子网掩码相与得到网络号

🌈 6.2 简单阐述下各种协议

ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
DHCP协议: 动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。
NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,
DHCP协议:一个局域网的网络协议,使用UDP协议工作,用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

🌈 6.3 DNS域名系统,简单描述其工作原理

当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。
客户机发送的每条查询信息包括三条信息:
包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别。基于UDP服务,端口53. 该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。

🌈 6.4 什么是网关,有什么作用?

网关(Gateway),网关顾名思义就是连接两个网络的设备,区别于路由器(由于历史的原因,许多有关TCP/IP 的文献曾经把网络层使用的路由器(Router)称为网关,在今天很多局域网采用都是路由来接入网络,因此现在通常指的网关就是路由器的IP),经常在家 庭中或者小型企业网络中使用,用于连接局域网和Internet。
网关也经常指把一种协议转成另一种协议的设备,比如语音网关。
在传统TCP/IP术语中,网络设备只分成两种,一种为网关(gateway),另一种为主机(host)。网关能在网络间转递数据包,但主机不能 转送数据包。在主机(又称终端系统,end system)中,数据包需经过TCP/IP四层协议处理,但是在网关(又称中介系 统,intermediate system)只需要到达网际层(Internet layer),决定路径之后就可以转送。在当时,网关 (gateway)与路由器(router)还没有区别。
在现代网络术语中,网关(gateway)与路由器(router)的定义不同。网关(gateway)能在不同协议间移动数据,而路由器(router)是在不同网络间移动数据,相当于传统所说的IP网关(IP gateway)。
网关是连接两个网络的设备,对于语音网关来说,他可以连接PSTN网络和以太网,这就相当于VOIP,把不同电话中的模拟信号通过网关而转换成数字信号,而且加入协议再去传输。在到了接收端的时候再通过网关还原成模拟的电话信号,最后才能在电话机上听到。
对于以太网中的网关只能转发三层以上数据包,这一点和路由是一样的。而不同的是网关中并没有路由表,他只能按照预先设定的不同网段来进行转发。网关最重要的一点就是端口映射,子网内用户在外网看来只是外网的IP地址对应着不同的端口,这样看来就会保护子网内的用户。

🌈 6.5 阐述下路由器的作用

路由器(Router)是一种计算机网络设备,提供了路由与转送两种重要机制,可以决定数据包从来源端到目的端所经过 的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转 送。路由工作在OSI模型的第三层——即网络层,例如网际协议。
路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。 路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)。

🌈 6.6 TCP的三次握手过程?

建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。
(1)TCP的三次握手过程:主机A向B发送连接请求;主机B对收到的主机A的报文段进行确认;主机A再次对主机B的确认进行确认。
(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
(3)采用两次握手不行,原因就是上面说的实效的连接请求的特殊情况。

在这里插入图片描述

这篇关于一个月挺近大厂,这份六脉神剑面试大总结真的牛掰的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/347231

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的