一起吃面筋 002

快春招了,小豪说吃面筋能够强身健体,因此烤了一些面筋和大家一起分享。凡事就怕认真,每天吃一点,让时间给你答案。

1.Mysql会使索引失效的情况?

回答思路:熟记索引优化、失效的几种情况。默念顺口溜,用自己的话把顺口溜翻译一遍。
参考回答

全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用。

2.举例MySQL发生死锁的情况?

回答思路:死锁一般是事务相互等待对方资源,最后形成环路造成的
参考回答
1.一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

2.用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。

3.如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。类似的情 况还有当表中的数据量非常庞大而索引建的过少或不合适的时候,使得经常发生全表扫描,最终应用系统会越来越慢,最终发生阻塞或死锁。

2. 了解MySQL分区、分表吗?分表的方式说一下 ?

回答思路:什么是分区、分表?为什么要分区、分表?两者的区别?分区的方式?
参考回答
分表 就是将一个大表分为许多个小表,减小数据库的负担,缩短查询时间。常见的分表方式有mysq集群、预先将会出现大数据量的表分为若干个小表、利用merge存储引擎来实现分表。

分区是将数据分段划分在多个位置存放,分区后,表还是一张表,但数据散列到多个位置了。

水平分区(Horizontal Partitioning) 这种形式分区是对表的行进行分区,所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。举例:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。

垂直分区(Vertical Partitioning)这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。举例:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

3. MySQL主从复制的实现流程?

回答思路
什么是主从复制?原理?作用?过程?
参考回答
将主数据库中的DDL和DML操作(操作数据库、操作数据库表)通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
作用:主数据库出现问题时可以切换到从数据库、可以进行数据库层面的读写分离、可以在从数据库上进行日常备份。
过程:Binary log代表主数据库的二进制日志;Relay log代表从服务器的中继日志。

第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。

4. 介绍一下常用的Linux命令 ?

回答思路
你能记住的常用的Linux命令,比如创建删除移动复制解压传输等。可以设想你现在在Linux环境下安装jdk,需要用到的步骤。
参考回答
cd / 进入根目录
cd … 返回上一级目录
pwd 显示工作路径
ls 查看当前目录下的子目录文件
mkdir dir1 创建一个叫做 dir1 的目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做file1的文件
rmdir dir1 删除一个叫做dir1的目录
rm -rf dir1 删除目录及内容
mv dir1 new_dir 移动一个目录
cp file1 file2 复制一个文件
tar -xvf xxx.tar 释放一个包
tar -xvf xxx.tar -C /tmp 将压缩包释放到/tmp目录下
还有部署项目要用到的一些命令也可以说。

5. Linux /etc /usr这两个目录下分别存放的什么文件 ?

回答思路
常用的linux系统中的文件夹的主要作用。
参考回答
/etc:系统配置文件存放的目录
/usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。

6. 什么是分布式session问题 ?

回答思路
什么是session,session共享,最好简单说下解决方案。
参考回答
Session 是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。最常见的,会把用户的登录信息、用户信息存储在 session 中,以保持登录状态。
分布式情况下,如果每台服务器都session存在自己的内存中,不同服务器之间就会造成数据不一致问题,比如:会导致请求落到不同服务器要重复登录的情况。

解决方案:
1.session复制
应用服务器开启web容器的session复制功能,在集群中的几台服务器之间同步session对象。缺点:数据传输有延时,容易造成网络风暴。
2.客户端存储
将session存储到浏览器cookie中。每次请求服务器的时候,将session放在请求中发送给服务器,服务器处理完请求后再将修改后的session响应给客户端。缺点: 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患session存储的数据大小受cookie限制。
3.反向代理hash一致性
反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上。缺点:如果web-server重启,一部分session会丢失,产生业务影响,例如部分用户重新登录。如果web-server水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session。
4.后端统一集中存储
将session存储在web-server后端的存储层,数据库或者缓存,一般用redis/memchache缓存。

7. 常见的负载均衡的策略 ?

回答思路
熟悉常用策略及应用场景与使用条件。
参考回答

1.轮询
每次请求到来进入下一台服务器进行处理。 使用条件:每台服务器的配置基本相同。
2.加权轮询
根据权重判断要在当前服务器中分配多少请求。
3.最小连接数
传入的请求会根据集群中服务器所打开的连接数来分配请求,也就是在集群中连接保持活跃数最低的服务器将接受下一次连接的请求。 使用条件:每台服务器的配置基本相同。
4.最小连接数慢启动时间
对当一台服务器刚上线的时候,为了防止服务器的资源被瞬间消耗完毕,配置一个时间段,在这个时间段内连接数是有限制并且是缓慢增加的。
5.加权最小连接数
如果理解了加权轮询和最小连接数,这个应该就不用解释了,如果不理解就再把上面的加权轮询和最小连接数方式理解一下。
6.基于代理的自适应负载均衡
负载主机 ---->集群负载 负载主机会定时搜集负载集群下服务器的状态,动态的计算每台服务器当下的容量,动态的分配到来的连接请求。
7.源HashIP 请求对应的服务器死固定的。hash定位到哪个服务器就请求就去哪个服务器。

7. MySQL的读写分离配置过程用到了什么注解 ?

回答思路
什么是读写分离?用到的注解有哪些?作用是什么?
参考回答

当数据库的数据量较大、并大量较高的时候,所有的读写操作都在同一个数据库可能会导致事务处理较为缓慢;所以,我们有时候就需要对数据库进行主从配置,进行读写分离,增删改的时候用主库,读取的时候用从库,这样也能有效提高数据库的读写效率;
读写分离实现过程需要自定义一个只读注解,被这个注解方法注解使用读库,其他使用写库,如果项目是中途改造成读写分离可使用这个方法,无需修改业务代码,只要在只读的 service 方法上加一个注解即可。
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ReadOnly {
}

8. Redis内存淘汰策略?

回答思路
什么是Redis内存淘汰策略?常见策略有哪些?
参考回答

9.什么是Redis缓存雪崩?什么是Redis缓存穿透?

回答思路
是什么?区别?怎么解决?
参考回答
缓存雪崩:同一时间Redis缓存的key大面积失效,那一瞬间Redis跟没有一样,恰好这个时候有大数量级别的请求直接打到数据库,数据库以及调用这个库的服务全部挂掉。
解决办法:在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值。
缓存穿透:缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
解决办法:数据校验。

10.Nio有哪些类 ?

回答思路
NIO的基本概念。
参考回答
普通的IO是面向流(Stream Oriented),而NIO则是面向缓冲区(Buffer Oriented)。IO流是单向的,直接面向字节流,通过InputStream、OutputStream来完成数据的输入输出。而NIO是双向的,通过建立通道(Channel),然后将数据装在缓冲区(Buffer)在通道上进行传输。重要的类有Channel类、Selector 类、Buffer类。

11. 举例常用的字节流,关闭字节流有几种方式 ?

回答思路
IO流的基本概念。
参考回答
常见的字节流的抽象基流:InputStream和OutputStream
关闭流的几种方式:
1.在finally最后调用close()关闭(普通)。
2.在finally中使用IOUtils.closeQuietly()方法关闭。
3.try-with-resource 语法糖。

12. SpringIOC注入bean有几种方式 ?

回答思路
Spring原理分析,IOC, AOP。
参考回答
A.通过方法注入Bean

  1. 通过构造方法注入Bean
  2. 通过Set方法注入Bean

B.通过属性注入Bean

C.通过集合类型注入Bean

  1. 直接注入集合实例
  2. 将多个泛型的实例注入到集合

D.简单类型(String、Integer)直接注入Bean

E.SpringIoc容器内置接口注入Bean

更多

对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值