Advertisement

互联网大厂必问之MySQL、Redis、Spring三大块,面试必备技术栈

阅读量:

前言

MySQL查询字段区不区分大小写?

答案是不区分

如何解决需要区分英文大小写的场景

例如将登录用户设为admin此时输入 ADMIN 能够实现自动登录功能如果系统设计要求用户名区分大小写那么你需要采取什么特别的措施来确保账号的安全性

解决方案一

MySQL默认的字符检索策略:utf8_general_ci,表示不区分大小写。

采用...标记来表示字符编码方案时,默认情况下会区分大小写字面效果不同。如果需要进行二进制比较操作,则应当选择...编码方案,并且同样支持区分字符的大小写特性。

注意:在Mysql5.6.10版本中,不支持utf8_genral_cs

在创建表时,请指定collation属性为...utf8_general_cs或...utf8_bin;若已建立表,请指定其相应字段的collation属性为...utf8_general_cs或...utf8_bin。

复制代码
 -- 创建表:

    
 CREATE TABLE testt(
    
 id INT PRIMARY KEY,
    
 name VARCHAR(32) NOT NULL
    
 ) ENGINE = INNODB COLLATE =utf8_bin;
    
  
    
 -- 修改表结构的Collation属性
    
 ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
    
    
    
    
    代码解读

解决方案二

直接修改sql语句,在要查询的字段前面加上binary关键字

复制代码
 -- 在每一个条件前加上binary关键字

    
 select * from user where binary username = 'admin' and binary password = 'admin';
    
  
    
 -- 将参数以binary('')包围
    
 select * from user where username like binary('admin') and password like binary('admin');
    
    
    
    
    代码解读

MySQL innodb的事务与日志的实现方式

有多少种日志

  • 错误收集与存储:系统会整合并存储错误信息、警示信息以及成功数据等关键数据。
  • 请求跟踪:系统会全面收集所有针对数据库的请求数据,并对这些请求进行分类管理。
  • 缓存超时监控:当检测到某个SQL语句的运行时间超出预设基准时间时,则将其指定为慢查询并进行单独处理。
  • 数据变更追踪:系统会完整保存所有修改数据库的操作历史,并为后续分析提供可靠依据。
  • 中继 logs 是一种特殊的二进制 logs 类型,在发生主从库故障时可辅助主库恢复工作。
  • 事务管理 logs:系统会分别生成 redo logs 和 undo logs 两种类型的数据文件,并对其内容进行严格隔离管理。

事物的4种隔离级别

  • 读未提交(RU)
  • 读已提交(RC)
  • 可重复读(RR)
  • 串行

事务是如何通过日志来实现的,说得越深入越好

事务日志是通过redo和Innodb存储引擎的日志缓冲机制(Innodb log buffer)来实现的,在创建新的事务时会记录该事务对应的LSN号码;

当事务处理时,在InnoDB存储引擎的日志缓存中会记录到其事务日志

当事务提交时, 必须将日志缓冲区的内容通过调用innodb_flush_log_at_trx_commit方法来实现, 即在执行数据 write 操作之前必须先记录日志. 这种做法被称为'预写日志机制'

MySQL binlog的几种日志录入格式以及区别

Statement:每一条会修改数据的sql都会记录在binlog中。

优点: 不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。

比较之下,在处理与日志相关的性能优化方面

缺点:因为只记录了执行语句,所以为了使所有这些指令能够在slaves上正常运行,并且确保所有指令在slaves上的执行结果与master节点一致的同时捕捉到一些与执行相关的元数据。

此外,在MySQL的复制操作中,默认情况下 slave节点必须与 master节点保持数据一致性。然而,在实际应用中可能会遇到一些特定功能模块导致的问题(例如睡眠机制、插入ID同步机制、自定义函数同步机制等),这些都需要特别处理才能避免出现udf相关问题)。

使用以下函数的语句也无法被复制:

LOAD_FILE()
UUID()
USER()
FOUND_ROWS()
SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)

同时在INSERT …SELECT 会产生比 RBR 更多的行级锁

Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。

优点在于,在binlog中无需记录执行的SQL指令及其相关的上下文信息细节;只需关注每条记录被修改后的内容即可。

所以rowlevel的日志系统会清晰地记录下每一笔数据修改的具体细节,并且在这些特定情况下不会有存储过程、函数或触发器被错误复制的情况发生

缺点:所有执行的语句在被存入日志的时候都会以每条单独的日志条目形式被处理

例如,在执行一次update语句时,并非只对单个数据进行修改即可满足需求;而是需要对多个数据进行批量更新操作。这样一来,在Binlog日志中将会有相应的记录生成。这将导致Binlog日志文件的大小显著增加;特别是在执行涉及表结构更改(如ALTER TABLE)的操作时,则会使得原本单一的数据变更行为变得异常复杂并占用大量资源——具体表现为在Binlog日志中将有针对每一行数据的详细记录。

Mixedlevel: 以上两种level的混合使用。

通常对语句进行修改时会采用Statement格式来存储Binlog数据。对于一些无法通过Statement实现主从复制操作的函数,则会转而采用Row格式来保存Binlog数据。需要注意的是,在实际应用中 MySQL会根据执行的具体SQL语句类型来决定记录的日志形式 从而在Statement和Row两种类型中选择合适的方式来存储日志信息。

最新版本的MySQL对row level模式进行了改进,并非所有修改都采用row level方式记录。当表结构发生变化时,则会切换为statement模式进行记录。对于涉及更新或删除操作的数据修改,则仍然会记录每条受影响的元组的变化情况。

MySQL 面试题

1、MySQL 中有哪几种锁?

2、MySQL 中有哪些不同的表格?

3、简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别?

4、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

5、CHAR 和 VARCHAR 的区别?

6、主键和候选键有什么区别?

7、myisamchk 是用来做什么的?

8、如果一个表有一列定义为 TIMESTAMP,将发生什么?

9、你怎么看到为表格定义的所有索引?

10、LIKE 声明中的%和_是什么意思?

11、列对比运算符是什么?

12、BLOB 和 TEXT 有什么区别?

13、MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?

答;以下是 MySQL_fetch_array 和 MySQL_fetch_object 的区别:

MySQL_fetch_array函数的主要作用是将查询结果以集合型数组的形式返回

(2)MySQL_fetch_object – 从数据库返回结果行作为对象。

14、MyISAM 表格将在哪里存储,并且还提供其存储格式?

15、MySQL 如何优化 DISTINCT?

16、如何显示前 50 行?

17、可以使用多少列创建索引?

18、NOW()和 CURRENT_DATE()有什么区别?

19、什么是非标准字符串类型?

20、什么是通用 SQL 函数?

21、MySQL 支持事务吗?

22、MySQL 里记录货币用什么字段类型好

23、MySQL 有关权限的表都有哪几个?

24、列的字符串类型可以是什么?

在 MySQL 数据库中用于存储发布系统的增量数据,每天新增超5000条以上,在预期的运维三年内如何进行优化?

26、锁的优化策略

27、索引的底层实现原理和优化

28、什么情况下设置了索引但无法使用

(1)以“%”开头的 LIKE 语句,模糊匹配。

(2)OR 语句前后没有同时使用索引。

(3)数据类型发生隐式转换(例如,在varchar字段不带引用符的情况下,默认会被解析为int类)。

Redis字符串的实现

虽然 Redis 是以 C 语言为基础编写的程序库实现的,并未直接使用 C 语言中的字符串类型;而是自行构建了一套专门用于 Redis 的字符串系统以应对特定需求这一设计不仅显著提升了运行效率和性能水平可以看出该系统在开发过程中同样耗费了大量心血

Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS

1.SDS 代码结构

复制代码
 struct sdshdr{

    
     //  记录已使用长度
    
     int len;
    
     // 记录空闲未使用的长度
    
     int free;
    
     // 字符数组
    
     char[] buf;
    
 };
    
    
    
    
    代码解读

SDS 是什么意思呢?这让我不解。对于那些不太熟悉的朋友来说,他们可能会对此名称产生疑惑。它只是一个普通的术语无需过分担忧。我们应该重点关注并学习借鉴其设计理念,并辅以图表进行直观展示。

Redis中的字符串也会遵循C语言字符串的实现方式, 也就是最后一位字符是以空字符结尾. 然而这个空字符在长度计算中并不被考虑.

2.SDS 动态扩展特点

SDS的最厉害最奇妙之处在于它的Dynamic。动态变化长度。举个例子

如上图所示,在初始状态下,s1仅有5个空闲座位。然而,在后续操作中需要追加字符串'world'共计六个字符,显然这是不够的。那么怎么办?Redis会依次执行以下三个操作:

评估当前存储空间是否达到需求。
将存储区域扩展至足以容纳所需数据。
当剩余可用空间小于1MB时, 分配至少1MB的空间块; 否则, 在已有占用的空间基础上再扩展出同样长度的空闲区域。

看到这里为止有没有朋友觉得这个实现像Java List的实现一样呢?看完后面的部分会发现越来越接近那种感觉。

Redis字符串的性能优势

  • 高效计算字符串长度
  • 防止内存溢出
  • 减少内存分配频率以提高内存利用率

1.快速获取字符串长度

再看下上面的SDS结构体:

复制代码
 struct sdshdr{

    
     //  记录已使用长度
    
     int len;
    
     // 记录空闲未使用的长度
    
     int free;
    
     // 字符数组
    
     char[] buf;
    
 };
    
    
    
    
    代码解读

因为SDS中存储了已使用的字符长度len,在需要获取字符串长度时可以直接返回len值。其时间复杂度为常数阶O(1)。相反地,在C语言中处理类似问题时,则需要使用特定的函数来计算字符串长度。假设使用C语言中的字符串,则其字符串长度获取函数的时间复杂度为O(n),其中n表示字符的数量。这是因为该过程是从头开始一直到遇到空字符'\0'为止进行逐个相加。

2.避免缓冲区溢出

对一个C语言字符串执行strcat函数进行追加操作时需要预先分配足够的内存空间。如果不进行内存分配可能会导致缓冲区溢出从而影响程序运行。例如如图所示现有两个字符串s₁="hello"和s₂="baby"当我们调用strcat(s₁,s₂)函数时若未为s₁预留足够的内存空间会导致溢出现象发生。

而针对Redis而言,在进行字符串追加操作时会确保存储空间足够以避免缓冲区溢出问题。在执行每一次追加操作之前均会采取以下措施:

  1. 计算出大小是否足够
  2. 开辟空间至满足所需大小

3.降低空间分配次数提升内存使用效率

在进行字符串追加操作时会遇到内存分配问题。然而这会导致内存划分算法和相关系统调用受到影响当频繁发生时会对性能造成负面影响因此对于性能至上的Redis来说必须避免采取以下两种优化措施以规避这些问题

  • 空间与分配
  • 惰性空间回收

1. 空间预分配

对于追加操作而言,在Redis中不仅要预留足够的内存空间而且还会预留未使用的内存空间(free),以便后续操作使用。即这些未使用的内存空间(free)的容量将取决于修改后的字符串长度。

当修改后的字符串长度len小于1M时,则会预留与当前字符串长度一致的空闲空间(free)。

当修改后的字符串长度len >= 1M,则会分配1M长度的未使用的空间(free)

采用该预分配策略后能够降低内存分配次数的原因是在内存分配前会评估现有的free空间是否足够大,在评估结果为足够的前提下就不会开辟新的free空间。

2. 惰性空间回收

与此相反,在处理字符串缩减时惰性空间回收同样适用。例如考虑一个字符串s1="hello world"。当我们对其执行sdstrim(s1," world")操作后Redis系统不会立即释放被缩减的部分空间;相反会将这些空间供其他需要内存处理的任务使用。然而Redis还提供了一个API让用户自行释放被缩减的部分内存空间以优化资源利用。

Redis 面试题

1、什么是 Redis?

2、Redis 的数据类型?

3、使用 Redis 有哪些好处?

4、Redis 相比 Memcached 有哪些优势?

5、Memcache 与 Redis 的区别都有哪些?

6、Redis 是单进程单线程的?

7、一个字符串类型的值能存储最大容量是多少?

8、Redis 的持久化机制是什么?各自的优缺点?

9、Redis 常见性能问题和解决方案:

10、redis 过期键的删除策略?

11、Redis 的回收策略(淘汰策略)?

12、为什么 edis 需要把所有数据放到内存中?

13、Redis 的同步机制了解么?

Redis 支持两种主要的主从模式:主动型和被动型。在首次连接建立时,默认情况下会发生一次 bgSave 操作,并在内存缓冲区中暂存所有后续的修改操作。当 bgSave 完成后,在后续阶段会将整个 rdb 文件内容一次性传输至复制节点。完成 rdb文件已成功镜像加载至复制节点后...

14、Pipeline 有什么好处,为什么要用 pipeline?

15、是否使用过 Redis 集群,集群的原理是什么?

16、Redis 集群方案什么情况下会导致整个集群不可用?

17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?

18、Jedis 与 Redisson 对比有什么优缺点?

19、Redis 如何设置密码及验证密码?

20、说说 Redis 哈希槽的概念?

21、Redis 集群的主从复制模型是怎样的?

22、Redis 集群会有写操作丢失吗?为什么?

23、Redis 集群之间是如何复制的?

24、Redis 集群最大节点个数是多少?

25、Redis 集群如何选择数据库?

26、怎么测试 Redis 的连通性?

27、怎么理解 Redis 事务?

28、Redis 事务相关的命令有哪几个?

答:异步复制

Spring 面试题

1、一般问题

1.1、不同版本的 Spring Framework 有哪些主要功能?

1.2、什么是 Spring Framework?

1.3、列举 Spring Framework 的优点。

基于其层次分明的设计模式, Spring Frameworks 为开发者提供了高度灵活的组件组合选择, 允许开发者根据需求灵活配置所需组件组合. 该框架不仅支持面向对象编程范式(POJO)实现, 还使其支持持续集成与模块化开发流程以及便于单元测试. 得益于JavaBean自动化的依赖注入机制及逆向工程控制反转技术, 这一机制使得 JDBC 连接操作更加便捷. 此外, 它作为一个完全开源且无许可约束的选择, 提供了高质量的技术服务.

1.4、Spring Framework 有哪些不同的功能?

1.5、Spring Framework 中有多少个模块,它们分别是什么?

1.6、什么是 Spring 配置文件?

1.7、Spring 应用程序有哪些不同组件?

1.8、使用 Spring 有哪些方式?

2、依赖注入(Ioc)

2.1、什么是 Spring IOC 容器?

Spring 框架的核心是其容器机制。该容器负责创建、装配以及管理应用组件的完整生命周期。依赖注入技术被用来协调应用各组件之间的交互关系。在初始化过程中,默认情况下会根据配置文件中的信息动态生成所需的对象实例,并按照规定的流程进行配置与组装工作;这种元数据信息可以通过多种格式提供给系统进行解析处理

2.2、什么是依赖注入?

2.3、可以通过多少种方式完成依赖注入?

2.4、区分构造函数注入和 setter 注入。

2.5、spring 中有多少种 IOC 容器?

2.6、区分 BeanFactory 和 ApplicationContext。

2.7、列举 IoC 的一些好处。

2.8、Spring IoC 的实现机制。

3、Beans

3.1、什么是 spring bean?

3.2、spring 提供了哪些配置方式?

3.3、spring 支持集中 bean scope?

3.4、spring bean 容器的生命周期是什么样的?

3.5、什么是 spring 的内部 bean?

3.6、什么是 spring 装配

3.7、自动装配有哪些方式?

3.8、自动装配有什么局限?

4、注解

4.1、什么是基于注解的容器配置

4.2、如何在 spring 中启动注解装配?

4.3、@Component, @Controller, @Repository, @Service 有何区别?

4.4、@Required 注解有什么用?

4.5、@Autowired 注解有什么用?

4.6、@Qualifier 注解有什么用?

4.7、@RequestMapping 注解有什么用?

5、数据访问

5.1、spring DAO 有什么用?

5.2、列举 Spring DAO 抛出的异常。

5.3、spring JDBC API 中存在哪些类?

5.4、使用 Spring 访问 Hibernate 的方法有哪些?

5.5、列举 spring 支持的事务管理类型

5.6、spring 支持哪些 ORM 框架

6、AOP

6.1、什么是 AOP?

6.2、什么是 Aspect?

6.3、什么是切点(JoinPoint)

6.4、什么是通知(Advice)?

6.5、有哪些类型的通知(Advice)?

6.6、指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处。

6.7、AOP 有哪些实现方式?

6.8、Spring AOP and AspectJ AOP 有什么区别?

6.9、如何理解 Spring 中的代理?

6.10、什么是编织(Weaving)?

7、MVC

7.1、Spring MVC 框架有什么用?

7.2、描述一下 DispatcherServlet 的工作流程

7.3、介绍一下 WebApplicationContext

结论
选择一份更好的工作,是对自己负责也是对他人的负责,当然面试一家好的公司也是需要自身日积月累知识的积累,俗话说:不打无准备之仗!最近我针对互联网公司面试问到的知识点,总结出了Java程序员面试涉及到的绝大部分面试题及答案分享给大家,希望能帮助到你面试前的复习且找到一个好的工作,也节省你在网上搜索资料的时间来学习。
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈。希望能够帮助到有需要的小伙伴们!已经为大家打包好,有需要的小伙伴可以自行领取一下!

👇🏻 添加 博主 获取更多资料👇🏻

全部评论 (0)

还没有任何评论哟~