Q:为什么MySQL的InnoDB采用B+树作为索引结构,而Redis采用跳表实现Zset?或者说,InnoDB为什么不用跳表,Redis为什么不用B+树?
对于MySQL来说,高度,代表磁盘IO次数,在相同高度下,B+树能存储的数据量远大于跳表。
所以对于相同的数据量,MySQL的InnoDB采用B+树索引只需要较少的磁盘IO即可完成读操作;
而对于写操作,B+树需要拆分合并索引数据页;跳表则独立插入,并根据随机函数确定层数,没有旋转和维持平衡的开销,写入性能会比B+树好很多。
由于Redis工作在内存,一次内存IO的开销较小,所以为了提高写入性能,采用跳表作为Zset的实现。
Q:JDK8的新特性
- 函数式接口
- Stream流
- Optional
- Datatime API
此处可以参考:https://javaguide.cn/java/new-features/java8-common-new-features.html#optional
Q:对Linux命令的了解 问了如何查看日志,解压缩的命令
关于Linux命令,查看日志和解压缩是两个常见操作。以下是相关的命令介绍:
查看日志的命令:
cat
:用于一次性显示整个日志文件内容。- 示例:
cat /var/log/syslog
- 示例:
less
:分屏查看日志,适合查看大型文件。- 示例:
less /var/log/syslog
- 可以用键盘上的
Up
和Down
键滚动文件。
- 示例:
tail
:查看文件末尾部分,常用于查看最新日志。- 示例:
tail -n 100 /var/log/syslog
显示最后 100 行日志。 - 加上
-f
选项可以实时查看日志的更新。- 示例:
tail -f /var/log/syslog
- 示例:
- 示例:
grep
:用于在日志文件中查找特定关键字。- 示例:
grep "error" /var/log/syslog
查找包含 “error” 的日志。
- 示例:
解压缩相关命令:
tar
:用于压缩和解压.tar
、.tar.gz
、.tar.bz2
等文件。- 解压
.tar.gz
文件:tar -xzvf file.tar.gz
- 解压
.tar.bz2
文件:tar -xjvf file.tar.bz2
- 创建
.tar.gz
压缩包:tar -czvf archive.tar.gz folder/
- 解压
zip
/unzip
:用于压缩和解压.zip
文件。- 解压
.zip
文件:unzip file.zip
- 创建
.zip
文件:zip -r archive.zip folder/
- 解压
gzip
和gunzip
:用于压缩和解压.gz
文件。- 压缩:
gzip file
- 解压:
gunzip file.gz
- 压缩:
7z
:用于解压.7z
文件,需要安装p7zip
。- 解压
.7z
文件:7z x file.7z
- 解压
Q:https加密的原理
- 哈希报文:为保证数据完整性,HTTPS会利用哈希算法如SHA-256生成报文摘要。如果接收到的数据经过计算得到的哈希值与原始值不符,则说明数据可能已被篡改
- 对称加密与非对称加密结合:非对称用于客户端和服务器交换密钥;服务器会发送它的公钥给客户端;客户端生成一个随机的对称密钥,并用服务器的公钥对其进行加密后发送回去。如此,客户端和服务端都获得了对称密钥,后续可以使用效率更高的对称加密进行对话
Q:sychronized和ReentrantLock区别
synchronized
是Java的内置关键字,Lock
是Java的一个类synchronized
无法获取锁的状态,Lock
可以synchronized
自动释放锁,Lock
需要手动释放锁synchronized
会造成忙等待,Lock
可以使用tryLock
synchronized
是可重入锁,不可中断,且非公平;Lock
也是可重入的,但是自由度更高,允许设置公平与非公平Lock
可以与Condtion
结合,实现更灵活的条件判断
Q:为什么ReentrantLock性能更好
- 自选等待:
ReentrantLock
利用了 CAS (Compare-And-Swap) 操作进行自旋等待,而synchronized
在某些情况下会直接将线程挂起。自旋锁在高并发环境下,如果锁的持有时间较短,可以避免线程切换带来的开销,从而提高性能 - 条件变量:
ReentrantLock
允许通过Condition
类实现多条件等待和唤醒,灵活性更高。它支持细粒度的通知机制,而synchronized
则依赖于wait
和notify/notifyAll
,只能对整个临界区进行等待和唤醒,可能导致不必要的性能损耗 - 尝试获取:
ReentrantLock
提供了tryLock()
方法,可以尝试获取锁,而不是总是等待,这在某些场景下能够避免不必要的阻塞,提升程序响应性 - 可中断锁:
ReentrantLock
提供可中断的锁请求 (lockInterruptibly
),当线程等待锁的过程中,可以响应中断信号。相比之下,synchronized
无法中断,线程必须等到锁被释放 - 释放灵活:
ReentrantLock
允许在不同的代码块中加锁和解锁,锁的释放是显式的,这让开发者可以更灵活地控制锁的范围,而synchronized
则是隐式加锁和释放,灵活性较低。
Q:工厂模式的几种实现区别
工厂模式有几种主要实现方式,包括简单工厂模式、工厂方法模式和抽象工厂模式:
- 简单工厂:工厂类中包含一个静态方法,根据传入的参数决定实例化哪一个具体的类
- 工厂方法:在父类中定义一个抽象的工厂方法,让子类去实现具体的创建逻辑
- 抽象工厂:提供一个接口,定义多个创建对象的工厂方法,用于创建一系列相关或依赖的对象,而无需指定具体的类。缺点是,扩展产品族较为困难,需要修改抽象工厂的接口及所有具体工厂。
Q:inner join、left join、right join区别
类型 | 作用 | 结果集特性 |
---|---|---|
INNER JOIN | 只返回两张表中匹配的行 | 返回匹配行 |
LEFT JOIN | 返回左表中所有行,即使右表没有匹配,右表中没有匹配时显示 NULL | 返回左表所有行,右表无匹配时为 NULL |
RIGHT JOIN | 返回右表中所有行,即使左表没有匹配,左表中没有匹配时显示 NULL | 返回右表所有行,左表无匹配时为 NULL |
NATURAL JOIN | 自动基于同名列进行匹配,不需要指定 ON 条件 | 自动使用同名列连接,可能会导致意外连接结果 |
在 SQL 中,直接使用 JOIN
(不加前缀)默认是 INNER JOIN
Q:mysql 多表联合更新
在 MySQL 中,可以使用多表联合更新(UPDATE JOIN
)来同时更新多个表的内容。通常,通过使用 JOIN
将多个表关联起来,再基于这些关联条件更新目标表中的数据。
UPDATE table1
JOIN table2 ON table1.column = table2.column
SET table1.column1 = value1, table2.column2 = value2
WHERE condition;
Q:mysql的存储过程
存储过程是预编译的 SQL 语句的集合,可以接收输入参数,进行逻辑处理,执行一系列操作,并且可以返回多个结果集。
语法:
IN
:表示输入参数,调用时传递进去,存储过程内部可以使用,但不能修改。
OUT
:表示输出参数,存储过程内部可以修改,并返回给调用者。
INOUT
:既可以输入,也可以输出,存储过程内部可以修改其值。
DELIMITER $$CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name data_type, ...)
BEGIN-- 过程中的逻辑代码-- SQL 语句集合
END$$DELIMITER ;
例如:
DELIMITER $$CREATE PROCEDURE GetEmployee(IN emp_id INT, OUT emp_name VARCHAR(50))
BEGINSELECT name INTO emp_nameFROM employeesWHERE id = emp_id;
END$$DELIMITER ;
调用示例:
CALL GetEmployee(1, @emp_name);
SELECT @emp_name;
Q:MySQl的存储过程与函数的区别
示例:
DELIMITER $$CREATE FUNCTION GetEmployeeName(emp_id INT)
RETURNS VARCHAR(50)
BEGINDECLARE emp_name VARCHAR(50);SELECT name INTO emp_nameFROM employeesWHERE id = emp_id;RETURN emp_name;
END$$DELIMITER ;
调用示例:
SELECT GetEmployeeName(1);
返回值:
- 存储过程:可以返回多个结果集或通过
OUT
参数返回值。 - 函数:必须返回一个值,且只能返回一个值。
调用方式:
- 存储过程:通过
CALL
语句调用。 - 函数:可以在 SQL 语句中像表达式一样调用,通常在
SELECT
、WHERE
、ORDER BY
等语句中使用。
使用场景:
- 存储过程:适用于需要执行复杂逻辑、多步骤操作,且可能不需要返回值或返回多个结果集的场景。
- 函数:适用于需要在 SQL 语句中进行简单计算或返回单一值的场景。
输入输出参数:
- 存储过程:可以有
IN
、OUT
和INOUT
参数。 - 函数:只能有
IN
参数,不能有OUT
参数,且必须有RETURN
返回值。