互联网大厂必问之yedispring三大块,面试必备技术栈

前言怎么样是不是感觉面试很难,而且快到了“年底”跳槽涨薪高峰季了,不管是实习生还是有想要跳槽的大佬们即将进入找工作的高峰期,在任何Java面试当中MySQL、Redis、Spring方面的问题都是必不可少的一部分。所以这篇文章是我最新整理的面试题答案以及总结,希望对想进互联网大厂的同学有帮助,由于篇幅较长,建议收藏后细看~

答案是不区分

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

例如登录用户为admin,此时填写ADMIN也能登录,如果用户名需要区分大小写,你的做法是什么?

解决方案一

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

可以使用utf8_general_cs,表示区分大小写,也可以使用utf8_bin,表示二进制比较,同样也区分大小写 。

创建表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直接修改字段的Collation属性为utf8_general_cs或者utf8_bin。

解决方案二

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

有多少种日志

错误日志:记录出错信息,也记录一些警告信息或者正确的信息。

查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。

二进制日志:记录对数据库执行更改的所有操作。

中继日志:中继日志也是二进制日志,用来给slave 库恢复

事务日志:重做日志redo和回滚日志undo

事物的4种隔离级别

读未提交(RU)

读已提交(RC)

可重复读(RR)

串行

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

事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(log sequence number)号;

当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;

当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”

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

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

相比row能节约多少性能 与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该根据应用的实际情况,其所 产生的日志量会增加多少,以及带来的IO性能问题。

缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同的结果。

另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题).

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

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

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

优点:binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。

所以rowlevel的日志内容会非常清楚的记录下 每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题

缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。

比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。

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

一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。

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 的区别:

(1)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、列的字符串类型可以是什么?

25、MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

26、锁的优化策略

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

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

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

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

(3)数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型)。

Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能,可以看出Redis为了高性能也是煞费苦心。

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

SDS ?什么鬼?可能对此陌生的朋友对这个名称有疑惑。只是个名词而已不必在意,我们要重点欣赏借鉴Redis的设计思路。下面画个图来说明,一目了然。

Redis的字符串也会遵守C语言的字符串的实现规则,即最后一个字符为空字符。然而这个空字符不会被计算在len里头。

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

如上图所示刚开始s1 只有5个空闲位子,后面需要追加' world' 6个字符,很明显是不够的。那咋办?Redis会做以下三个操作:

计算出大小是否足够

开辟空间至满足所需大小

开辟与已使用大小len相同长度的空闲free空间(如果len < 1M)开辟1M长度的空闲free空间(如果len >= 1M)

看到这儿为止有没有朋友觉得这个实现跟Java的列表List实现有点类似呢?看完后面的会觉得更像了。

快速获取字符串长度

避免缓冲区溢出

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

再看下上面的SDS结构体:

由于在SDS里存了已使用字符长度len,所以当想获取字符串长度时直接返回len即可,时间复杂度为O(1)。如果使用C语言的字符串的话它的字符串长度获取函数时间复杂度为O(n),n为字符个数,因为他是从头到尾(到空字符'\0')遍历相加。

对一个C语言字符串进行strcat追加字符串的时候需要提前开辟需要的空间,如果不开辟空间的话可能会造成缓冲区溢出,而影响程序其他代码。如下图,有一个字符串s1="hello" 和 字符串s2="baby",现在要执行strcat(s1,"world"),并且执行前未给s1开辟空间,所以造成了缓冲区溢出。

而对于Redis而言由于每次追加字符串时都会检查空间是否够用,所以不会存在缓冲区溢出问题。每次追加操作前都会做如下操作:

计算出大小是否足够

开辟空间至满足所需大小

字符串的追加操作会涉及到内存分配问题,然而内存分配问题会牵扯内存划分算法以及系统调用所以如果频繁发生的话影响性能,所以对于性能至上的Redis来说这是万万不能忍受的。所以采取了以下两种优化措施

空间与分配

惰性空间回收

1. 空间预分配

对于追加操作来说,Redis不仅会开辟空间至够用而且还会预分配未使用的空间(free)来用于下一次操作。至于未使用的空间(free)的大小则由修改后的字符串长度决定。

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

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

有了这个预分配策略之后会减少内存分配次数,因为分配之前会检查已有的free空间是否够,如果够则不开辟了~

2. 惰性空间回收

与上面情况相反,惰性空间回收适用于字符串缩减操作。比如有个字符串s1="hello world",对s1进行sdstrim(s1," world")操作,执行完该操作之后Redis不会立即回收减少的部分,而是会分配给下一个需要内存的程序。当然,Redis也提供了回收内存的api,可以自己手动调用来回收缩减部分的内存。

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,并同时将后续修改操作记录到内存 buffer,待完成后将 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 的分层架构,用户可以自由选择自己需要的组件。Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,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 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。

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 有什么区别?

THE END
0.结构类型还可以使用readonly修饰符来声明实例成员不会修改结构的状态。 如果不能将整个结构类型声明为readonly,可使用readonly修饰符标记不会修改结构状态的实例成员。 在readonly实例成员内,不能分配到结构的实例字段。 但是,readonly成员可以调用非readonly成员。 在这种情况下,编译器将创建结构实例的副本,并调用该副本上的非jvzquC41fqit0vnetqyph}3eqo5{j6hp1fuupny1eunbty4ncpmvcpj/tglftnseg1hvkuykp/zzrnx1uvxve}
1.语法结构类型是什么粘着语也是一种重要的语言结构类型.粘着语的主要特点是没有内部屈折,每一个变词语素只表示一种语法意义,而每种语法意义也总是由一个变词语素表示.因此,一个词如果要表示三种语法意义就需要有三个变词语素.此外,粘着语的词根和变词语素之间的结合并不紧密.两者都有相当大的独立性,变词语素好像是粘附在词根上jvzquC41sd4{wx~gdcth0lto1zlf/zzguvopp8vwguzjqw44;3k:3o5833>fem<;79;e6?::3e;83;h0jvsm
2.结构体类型是什么?如何定义?(2)结构体类型与整型、浮点类型、字符类型等类似,只是数据类型,而非变量。 (3)定义好一个结构体类型后,并不意味着编译器会分配一块内存单元存放各个数据成员,它只是告诉编译系统结构体类型由哪些类型的成员构成、各占多少字节、按什么格式存储,并把它们当作一个整体来处理。 jvzquC41yy}/k}hcuv4dp8sgyu532;5335603A5636798;:0ujznn
3.JavaScript数据类型和数据结构编程语言都有内置的数据结构,但各种编程语言的数据结构常有不同之处。本文尝试列出 JavaScript 语言中内置的数据结构及其属性。它们可以用来构建其他的数据结构。jvzq<84fgxkmqyjt0ou{kuqc0qxh1ƒm/EP5eqlx1Ygh0Lj{cUexjr}4Fcvg`u}wwev{sg|
4.详解公司组织结构的6种基本类型是什么?附免费模板!公司组织结构是指一个组织内部不同职能部门和个体之间的层级关系、职责分工以及沟通合作方式。它决定了一个组织的权力和信息流动方式,影响着组织内部的效率、灵活性和决策能力。选择合适的公司组织结构类型对于企业的成功至关重要。 本文将结合boardmix博思白板为大家详解6种最常用的公司组织结构的基本类型,帮助大家深入理jvzquC41dqgsfvnz0et0c{ykenk086y{rgy.exrrcp.q{lcpk€bvrtpcn3tv{zevwxfu8
5.定义数据结构中重复定义结构体类型的作用是什么?定义数据结构中重复定义结构体类型的作用是为了更加直观的表达数据类型。比如Position FindMin(SearchTree T),完全可以写成TreeNode* FindMin(TreeNode* T),只是名列前茅种方法更为直观一些,表示传入的是一颗树,而返回的是最小值所在的位置结点。 结构体的定义 结构体(struct)是由一系列具有相同类型或不同类型 jvzq<84yyy4nqknngvxbkw3qti5bdxzv1DHT1;56756/j}rn
6.写出下列是什么结构类型的短语(如偏正、动宾、主谓……)1、来势写出下列是什么结构类型的短语(如偏正、动宾、主谓……)1、来势汹汹2、声名狼藉3、穷形尽相4、无精打采5、不知所措6、甘拜下风7、修了三年8、苦得他像一个木偶人9、放了一天假10、jvzquC41yy}/|‚gcpi4dqv4swgyukxs1d8836o;cee;cd?=:57l7;o:f95:39m8d0jznn
7.新闻写作常识小读本学习动态消息的结构类型 1、倒金字塔式结构 所谓的倒金字塔式结构,就是把最重要、最新鲜、最精彩的新闻事实放在最前面,然后依次后推,形成“虎头蛇尾”形状。这是一种最常见的传统的新闻结构方式。常应用于动态新闻。 2、金字塔式结构 所谓金字塔式结构,即上小下大的形式,按事件发展的顺序,把最重要的结局放到后面去写。常jvzq<84yyy4ev|y0et04964/2704B4eqpzfp}d478>157mvo
8.商务网站开发范文同前面两种结构相比,网状结构显得更灵活、更随意,但很容易使人“迷路”,解决的办法是在每个页面使用导航条;复合结构是上面几种结构类型的组合。网站无论采用何种结构,目的都是要让用户迅速找到感兴趣的内容。 电子商务网站规划涉及的内容很多,如网站的技术解决方案、网页设计、项目计划的制定、网站的维护与推广、网站jvzquC41yy}/i€~qq0ipo8mcqyko1::347=/j}rn
9.不是所有的电缆都能防水,如何区分防水电缆广材资讯防水电缆的结构类型 1.对于单芯电缆来说,绝缘屏蔽层上绕包半导电阻水带,外面绕包普通阻水带,然后挤包外护套,则为了保证金属屏蔽的充分接触,只在绝缘屏蔽外面绕包单导电阻水带,金属屏蔽外不再绕阻水带,视防水性能要求的高低,填充可采用普通填充或阻水填充,内衬层及外护套材料同单芯电缆中所述。 jvzquC41pg}t0pqfle4dqv4ctvodnn4456930qyon
10.C语言struct结构类型定义和结构变量说明c++struct这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数jvzquC41dnuh0lxfp0tfv8}wgh{329=1ctzjeuj1fgzbkux168:59@5
11.C#语言基础——结构体和枚举类型全面解析C#教程【技术要点】定义jiegouti类型的结构体,原有3个结构变量,fenshu,name,kecheng,新增一个变量public int[] shuzu,而这个结构元素还可以包含一个新结构体,在主函数中重新(new 初始化)定义一个参数接收这个新的结构变量,然后输出name,返回一个字符串。 【案例3】在上面jiegouti类型的结构体元素还可以包含另外一个结构 jvzquC41yy}/lk:30pku1jwvkerf1A=46:4ivv
12.判断下列短语是什么结构类型?1.十分高兴2.高高的个子3.广州的判断下列短语是什么结构类型?1.十分高兴 2.高高的个子 3.广州的公园 4.写得很清楚 5.去北京 6.不马上来 7.穿上衣服跳下床开门出去 8.经理叫我们明天加班9.一群看热闹的 10.所见所闻 11.秉公jvzquC41yy}/|‚gcpi4dqv4swgyukxs15c9b:n8fc9=13:=7h:;:g?k832jbgo5;0jznn