Java相关面试题总结+答案(九)

【MySQL】node


164. 数据库的三范式是什么?mysql

  • 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
  • 第二范式:属性彻底依赖于主键(知足第一范式的前提下),即任意一个字段只依赖于表中的同一个字段。
  • 第三范式:任何非主属性不依赖于其它非主属性(知足第二范式的前提下)。即不存在传递依赖。

165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?nginx

  • 数据库引擎若是是 MyISAM ,那 id 就是 8。
  • 数据库引擎若是是 InnoDB,那 id 就是 6。

  InnoDB 表只会把自增主键的最大 id 记录在内存中,因此重启以后会致使最大 id 丢失。算法

166. 如何获取当前数据库版本?sql

  使用 select version() 获取当前 MySQL 数据库版本。数据库

167. 说一下 ACID 是什么?缓存

  • Atomicity(原子性):一个事务(transaction)中的全部操做,或者所有完成,或者所有不完成,不会结束在中间某个环节。事务在执行过程当中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务历来没有执行过同样。即,事务不可分割、不可约简。
  • Consistency(一致性):在事务开始以前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须彻底符合全部的预设约束、触发器、级联回滚等。
  • Isolation(隔离性):数据库容许多个并发事务同时对其数据进行读写和修改的能力,隔离性能够防止多个事务并发执行时因为交叉执行而致使数据的不一致。事务隔离分为不一样级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。

168. char 和 varchar 的区别是什么?性能优化

  • char(n) :固定长度类型,好比订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间仍是 10 个字节,其余 7 个是空字节。

  char 优势:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 很是合适。服务器

  • varchar(n) :可变长度,存储的值是每一个值占用的字节再加上一个用来记录其长度的字节的长度。

  因此,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,两者使用须要权衡。网络

169. float 和 double 的区别是什么?

  • float 最多能够存储 8 位的十进制数,并在内存中占 4 字节。
  • double 最可能够存储 16 位的十进制数,并在内存中占 8 字节。

170. MySQL 的内链接、左链接、右链接有什么区别?

内链接关键字:inner join;左链接:left join;右链接:right join。

内链接是把匹配的关联数据显示出来;左链接是左边的表所有显示出来,右边的表显示出符合条件的数据;右链接正好相反。

171. MySQL 索引是怎么实现的?

索引是知足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。

具体来讲 MySQL 中的索引,不一样的数据引擎实现有所不一样,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,能够到达二分法的性能,找到数据区域以后就找到了完整的数据结构了,全部索引的性能也是更好的。

172. 怎么验证 MySQL 的索引是否知足需求?

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否知足需求。

explain 语法:explain select * from table where type=1。

173. 说一下数据库的事务隔离?

MySQL 的事务隔离是在 MySQL. ini 配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

    • READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其余事务读取(会出现幻读、脏读、不可重复读)。
    • READ-COMMITTED:提交读,一个事务提交后才能被其余事务读取到(会形成幻读、不可重复读)。
    • REPEATABLE-READ:可重复读,默认级别,保证屡次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会形成幻读)。
    • SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

脏读 :表示一个事务可以读取另外一个事务中还未提交的数据。好比,某个事务尝试插入记录 A,此时该事务还未提交,而后另外一个事务尝试读取到了记录 A。

不可重复读 :是指在一个事务内,屡次读同一数据。

幻读 :指同一个事务内屡次查询返回的结果集不同。好比同一个事务 A 第一次查询时候有 n 条记录,可是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的缘由也是另一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,全部数据行的记录就变多或者变少了。

174. 说一下 MySQL 经常使用的引擎?

  • InnoDB 引擎:mysql 5.1 后默认的数据库引擎,提供了对数据库 acid 事务的支持,而且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中创建缓冲池,用于缓冲数据和索引。可是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,因此当进行 select count(*) from table 指令的时候,须要进行扫描全表。因为锁的粒度小,写操做是不会锁定全表的,因此在并发度较高的场景下使用会提高效率的。
  • MyIASM 引擎:不提供事务的支持,也不支持行级锁和外键。所以当执行插入和更新语句时,即执行写操做的时候须要锁定这个表,因此会致使效率会下降。不过和 InnoDB 不一样的是,MyIASM 引擎是保存了表的行数,因而当进行 select count(*) from table 语句时,能够直接的读取已经保存的值而不须要进行扫描全表。因此,若是表的读操做远远多于写操做时,而且不须要事务的支持的,能够将 MyIASM 做为数据库引擎的首选。

175. 说一下 MySQL 的行锁和表锁?

MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。

    • 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的几率最高,并发量最低。
    • 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的几率小,并发度最高。
  • 176. 说一下乐观锁和悲观锁?
  • 乐观锁:每次去拿数据的时候都认为别人不会修改,因此不会上锁,可是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
  • 悲观锁:每次去拿数据的时候都认为别人会修改,因此每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。

  数据库的乐观锁须要本身实现,在表里面添加一个 version 字段,每次修改为功值加 1,这样每次修改的时候先对比一下,本身拥有的 version 和数据库如今的 version 是否一致,若是不一致就不修改,这样就实现了乐观锁。

177. MySQL 问题排查都有哪些手段?

  • 使用 show processlist 命令查看当前全部链接信息。
  • 使用 explain 命令查询 SQL 语句执行计划。
  • 开启慢查询日志,查看慢查询的 SQL。

178. 如何作 MySQL 的性能优化?

  • 为搜索字段建立索引。
  • 避免使用 select *,列出须要查询的字段。
  • 垂直分割分表。
  • 选择正确的存储引擎。

【Redis】


179. Redis 是什么?都有哪些使用场景?

Redis 是一个使用 C 语言开发的高速缓存数据库。

Redis 使用场景:

    • 记录帖子点赞数、点击数、评论数;
    • 缓存近期热帖;
    • 缓存文章详情信息;
    • 记录用户会话信息。

180. Redis 有哪些功能?

  • 数据缓存功能
  • 分布式锁的功能
  • 支持数据持久化
  • 支持事务
  • 支持消息队列

181. Redis 和 memcache 有什么区别?

  • 存储方式不一样:memcache 把数据所有存在内存之中,断电后会挂掉,数据不能超过内存大小;Redis 有部份存在硬盘上,这样能保证数据的持久性。
  • 数据支持类型:memcache 对数据类型支持相对简单;Redis 有复杂的数据类型。
  • 使用底层模型不一样:它们之间底层实现方式,以及与客户端之间通讯的应用协议不同,Redis 本身构建了 vm 机制,由于通常的系统调用系统函数的话,会浪费必定的时间去移动和请求。
  • value 值大小不一样:Redis 最大能够达到 512mb;memcache 只有 1mb。

182. Redis 为何是单线程的?

由于 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有多是机器内存或者网络带宽。既然单线程容易实现,并且 cpu 又不会成为瓶颈,那就瓜熟蒂落地采用单线程的方案了。

关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

并且单线程并不表明就慢 nginx 和 nodejs 也都是高性能单线程的表明。

183. 什么是缓存穿透?怎么解决?

缓存穿透:指查询一个必定不存在的数据,因为缓存是不命中时须要从数据库查询,查不到数据则不写入缓存,这将致使这个不存在的数据每次请求都要到数据库去查询,形成缓存穿透。

解决方案:最简单粗暴的方法若是一个查询返回的数据为空(不论是数据不存在,仍是系统故障),咱们就把这个空结果进行缓存,但它的过时时间会很短,最长不超过五分钟。

184. Redis 支持的数据类型有哪些?

  Redis 支持的数据类型:string(字符串)、list(列表)、hash(散列表)、set(集合)、zset(有序集合)。

185. Redis 支持的 Java 客户端都有哪些?

  支持的 Java 客户端有 Redisson、jedis、lettuce 等。

186. jedis 和 Redisson 有哪些区别?

  • jedis:提供了比较全面的 Redis 命令的支持。
  • Redisson:实现了分布式和可扩展的 Java 数据结构,与 jedis 相比 Redisson 的功能相对简单,不支持排序、事务、管道、分区等 Redis 特性。

187. 怎么保证缓存和数据库数据的一致性?

  • 合理设置缓存的过时时间。
  • 新增、更改、删除数据库操做时同步更新 Redis,可使用事物机制来保证数据的一致性。

188. Redis 持久化有几种方式?

Redis 的持久化有两种方式,或者说有两种策略:

    • RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
    • AOF(Append Only File):每个收到的写命令都经过write函数追加到文件中。

189. Redis 怎么实现分布式锁?

Redis 分布式锁其实就是在系统里面占一个“坑”,其余程序也要占“坑”的时候,占用成功了就能够继续执行,失败了就只能放弃或稍后重试。

占坑通常使用 setnx(set if not exists)指令,只容许被一个程序占有,使用完调用 del 释放锁。

190. Redis 分布式锁有什么缺陷?

  Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行若是超出了锁的超时时间就会出现问题。

191. Redis 如何作内存优化?

  尽可能使用 Redis 的散列表,把相关的信息放到散列表里面存储,而不是把每一个字段单独存储,这样能够有效的减小内存使用。好比将 Web 系统的用户对象,应该放到散列表里面再总体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存储。

192. Redis 淘汰策略有哪些?

  • volatile-lru:从已设置过时时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。
  • volatile-ttl:从已设置过时时间的数据集(server. db[i]. expires)中挑选将要过时的数据淘汰。
  • volatile-random:从已设置过时时间的数据集(server. db[i]. expires)中任意选择数据淘汰。
  • allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。
  • allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
  • no-enviction(驱逐):禁止驱逐数据。

193. Redis 常见的性能问题有哪些?该如何解决?

  • 主服务器写内存快照,会阻塞主线程的工做,当快照比较大时对性能影响是很是大的,会间断性暂停服务,因此主服务器最好不要写内存快照。
  • Redis 主从复制的性能问题,为了主从复制的速度和链接的稳定性,主从库最好在同一个局域网内。
相关文章
相关标签/搜索