阿里P8架构师面试总结:Mysql+Redis+Spring+多线程(含答案)

2019-08-23     IT技术分享

Mysql

1、我们如何在mysql中运行批处理模式? 以下命令用于在批处理模式下运行: mysql; mysql mysql.out

2、MyISAM表格将在哪里存储,并且还提供其存储格式? 每个MyISAM表格以三种格式存储在磁盘上: ·“.frm”文件存储表定义 ·数据文件具有“.MYD”(MYData)扩展名 索引文件具有“.MYI”(MYIndex)扩展名

3.、Mysql中有哪些不同的表格? 共有5种类型的表格:  MyISAM  Heap  Merge  INNODB  ISAM MyISAM是Mysql的默认存储引擎。

4、ISAM是什么? ISAM 简称为索引顺序访问方法。它是由IBM 开发的,用于在磁带等辅助存储系统上存储 和检索数据。

5、InnoDB是什么? lnnoDB是一个由Oracle公司开发的Innobase Oy事务安全存储引擎。

6、Mysql如何优化DISTINCT? DISTINCT在所有列上转换为GROUP BY,并与ORDER BY子句结合使用。 SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

7、如何输入字符为十六进制数字? 如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者 只用(Ox)前缀输入十六进制数字。 如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。

Spring

1. 什么是 Spring 的依赖注入? 依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释。这概念是说你不 用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务, 但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC 容器)负责把 他们组装起来。

2. 有哪些不同类型的 IOC(依赖注入)方式? 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一 系列参数,每个参数代表一个对其他类的依赖。 Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工厂 方 法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注 入。

3. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入? 你两种依赖方式都可以使用,构造器注入和 Setter 方法注入。最好的解决方案是用 构造器参数实现强制依赖,setter 方法实现可选依赖。

4. 一个 Spring 的应用看起来象什么?

一个定义了一些功能的接口

这实现包括属性,它的 Setter , getter 方法和函数等

Spring AOP  Spring 的 XML 配置文件

使用以上功能的客户端程序

Redis

1、都有哪些办法可以降低Redis的内存使用情况呢? 如果你使用的是 32 位的 Redis 实例,可以好好利用 Hash,list,sortedset,set 等集合类型数据, 因为通常情况下很多小的 Key-Value 可以用更紧凑的方式存放到一起。

43、查看Redis使用情况及状态信息用什么命令? info

2、Redis的内存用完了会发生什么? 如果达到设置的上限,Redis 的写命令会返回错误信息(但是读命令还可以正常返回。)或 者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

3、Redis是单线程的,如何提高多核CPU 的利用率? 可以在同一个服务器部署多个 Redis 的实例,并把他们当作不同的服务器来使用,在某些时 候,无论如何一个服务器是不够的, 所以,如果你想使用多个 CPU,你可以考虑一下分片(shard)。

4、一个 Redis 实例最多能存放多少的 keys?List、Set、 SortedSet他们最多能存放多少元素? 理论上 Redis 可以处理多达 232 的 keys,并且在实际中进行了测试,每个实例至少存放了 2 亿 5 千万的 keys。我们正在测试一些较大的值。

任何 list、set、和 sortedset 都可以放 232 个元素。

换句话说,Redis 的存储极限是系统中的可用内存值。

5、Redis常见性能问题和解决方案?

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF 日志文件

(2) 如果数据比较重要,某个Slave开启AOF 备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

多线程

1、怎么唤醒一个阻塞的线程? 如果线程是因为调用了 wait()、sleep()或者 join()方法而导致的阻塞,可以中断线程, 并且通过抛出 InterruptedException 来唤醒它;如果线程遇到了 IO 阻塞,无能为力, 因为 IO是操作系统实现的,Java 代码并没有办法直接接触到操作系统。

2、不可变对象对多线程有什么帮助? 不可变对象保证了对象的内存可见性,对不可变对象的读取不需要进行额外的同步 手段,提升了代码执行效率。

3、多线程上下文切换是什么意思? 多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另外一个 就绪并等待获取 CPU 执行权的线程的过程。

4、Java 中用到了什么线程调度算法? 抢占式。一个线程用完 CPU 之后,操作系统会根据线程优先级、线程饥饿情况等 数据算出一个总的优先级并分配下一个时间片给某个线程执行。

5、Thread.sleep(0)的作用是什么? 由于 Java 采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到 CPU 控制权的情况,为了让某些优先级比较低的线程也能获取到 CPU 控制权,可以使 用 Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡 CPU 控制 权的一种操作。

6、Java 中堆和栈有什么不同? 每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中 存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对 象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线 程使用该变量就可能引发问题,这时 volatile 变量就可以发挥作用了,它要求线程 从主存中读取变量的值。

7、你如何在 Java 中获取线程堆栈? 对于不同的操作系统,有多种方法来获得 Java 进程的线程堆栈。当你获取线程堆 栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台。在 Windows 你 可以使用 Ctrl + Break 组合键来获取线程堆栈,Linux 下用 kill -3 命令。你也可以 用 jstack 这个工具来获取,它对线程 id 进行操作,你可以用 jps 这个工具找到 id。

8、如何创建线程安全的单例模式? 单例模式即一个 JVM 内存中只存在一个类的对象实例分类 1、懒汉式 类加载的时候就创建实例 2、饿汉式 使用的时候才创建实例。

转发+关注,然后私信回复“资料”即可免费获得资料的领取方式!

文章来源: https://twgreatdaily.com/zh-hans/j77BP20BJleJMoPM0qQp.html