【每日一面】day04

ops/2024/10/22 0:57:06/

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命令,查看日志和解压缩是两个常见操作。以下是相关的命令介绍:

查看日志的命令:

  1. cat:用于一次性显示整个日志文件内容。
    • 示例:cat /var/log/syslog
  2. less:分屏查看日志,适合查看大型文件。
    • 示例:less /var/log/syslog
    • 可以用键盘上的 UpDown 键滚动文件。
  3. tail:查看文件末尾部分,常用于查看最新日志。
    • 示例:tail -n 100 /var/log/syslog 显示最后 100 行日志。
    • 加上 -f 选项可以实时查看日志的更新。
      • 示例:tail -f /var/log/syslog
  4. grep:用于在日志文件中查找特定关键字。
    • 示例:grep "error" /var/log/syslog 查找包含 “error” 的日志。

解压缩相关命令:

  1. 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/
  2. zip / unzip:用于压缩和解压 .zip 文件。
    • 解压 .zip 文件:unzip file.zip
    • 创建 .zip 文件:zip -r archive.zip folder/
  3. gzipgunzip:用于压缩和解压 .gz 文件。
    • 压缩:gzip file
    • 解压:gunzip file.gz
  4. 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性能更好

  1. 自选等待:ReentrantLock 利用了 CAS (Compare-And-Swap) 操作进行自旋等待,而 synchronized 在某些情况下会直接将线程挂起。自旋锁在高并发环境下,如果锁的持有时间较短,可以避免线程切换带来的开销,从而提高性能
  2. 条件变量:ReentrantLock 允许通过 Condition 类实现多条件等待和唤醒,灵活性更高。它支持细粒度的通知机制,而 synchronized 则依赖于 waitnotify/notifyAll,只能对整个临界区进行等待和唤醒,可能导致不必要的性能损耗
  3. 尝试获取:ReentrantLock 提供了 tryLock() 方法,可以尝试获取锁,而不是总是等待,这在某些场景下能够避免不必要的阻塞,提升程序响应性
  4. 可中断锁:ReentrantLock 提供可中断的锁请求 (lockInterruptibly),当线程等待锁的过程中,可以响应中断信号。相比之下,synchronized 无法中断,线程必须等到锁被释放
  5. 释放灵活:ReentrantLock 允许在不同的代码块中加锁和解锁,锁的释放是显式的,这让开发者可以更灵活地控制锁的范围,而 synchronized 则是隐式加锁和释放,灵活性较低。

Q:工厂模式的几种实现区别

工厂模式有几种主要实现方式,包括简单工厂模式、工厂方法模式和抽象工厂模式:

  1. 简单工厂:工厂类中包含一个静态方法,根据传入的参数决定实例化哪一个具体的类
  2. 工厂方法:在父类中定义一个抽象的工厂方法,让子类去实现具体的创建逻辑
  3. 抽象工厂:提供一个接口,定义多个创建对象的工厂方法,用于创建一系列相关或依赖的对象,而无需指定具体的类。缺点是,扩展产品族较为困难,需要修改抽象工厂的接口及所有具体工厂。

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 语句中像表达式一样调用,通常在 SELECTWHEREORDER BY 等语句中使用。

使用场景

  • 存储过程:适用于需要执行复杂逻辑、多步骤操作,且可能不需要返回值或返回多个结果集的场景。
  • 函数:适用于需要在 SQL 语句中进行简单计算或返回单一值的场景。

输入输出参数

  • 存储过程:可以有 INOUTINOUT 参数。
  • 函数:只能有 IN 参数,不能有 OUT 参数,且必须有 RETURN 返回值。

http://www.ppmy.cn/ops/127427.html

相关文章

开源呼叫中心系统 FreeIPCC:大模型、知识库、企业官网与企业论坛社区的联动策略

大模型、知识库、企业官网与企业论坛社区的联动策略 作者:开源呼叫中心系统 FreeIPCC 在当今数字化时代,企业为了提升竞争力,不仅需要拥有强大的技术实力,还需要构建一套高效的信息管理和交互系统。大模型、知识库、企业官网以及…

随机数生成

Math.random double val Math.random(); 生成的是[0,1]之间的浮点数, 生成一个[120.500]区间的随机数 int and Double.valueOf(Math.ceil(Math.random()*381120)).intValue();Math.ceil只取浮点数的整数部分 Math.random()的实现 private static final class R…

中小型医院网站:Spring Boot框架实践

6 系统测试 6.1 测试定义 系统测试主要是判断系统是否可以正常运行,功能模块是否可以实现操作。程序代码中是否有错误出现。测试程序是开发过程中的一个主要问题。就算系统完成的再好,再进行程序测试时也会也会发现一个重来没有被发现的错误信息。 测试不…

uniappx uts自学(2024/10/14)

uts需要类型 uts声明变量 let 或 const let相当于 TypeScript 中的 let、kotlin 中的 var、swift 中的 var。 cosnt相当于 TypeScript 中的 const、kotlin 中的 val、swift 中的 let。 let [变量名] : [类型] 值; let str :string "hello"; // 声明一个字符串…

【MySQL】事务

目录 事务的概念 CURD不加控制会导致什么问题 什么是事务 为什么需要事务 事务的操作 事务的版本支持 事务的提交方式 事务常见操作方式 事务的隔离级别 如何理解隔离性 四个隔离级别 查看与设置隔离级别 隔离级别的使用 进一步探究读写隔离 了解MVCC 事务的概念…

从0到1构建webpack多页面多环境应用

Webpack凭借强大的功能,成为最流行和最活跃的打包工具,也是面试时高级程序员必须掌握的“软技能”;笔者结合在项目中的使用经验,介绍webpack的使用;本文是入门篇,主要介绍webpack的入口、输出和各种loader、…

vue后台管理系统从0到1(5)

文章目录 vue后台管理系统从0到1(5)完善侧边栏修改bug渲染header导航栏 vue后台管理系统从0到1(5) 接上一期,我们需要完善我们的侧边狼 完善侧边栏 我们在 element 组件中可以看见,这一个侧边栏是符合我们…

element-ui table 前端分页

直接上代码吧。 <el-tableref"customerListTable"border:data"dataSource2"v-loading"loading":row-style"{ height: 55px }"header-cell-class-name"table-header"row-class-name"table-row"style"widt…