Redis

  1. 使用Redis有哪些好处?
  2. redis相比memcached有哪些优势?
  3. redis常见性能问题和解决方案
  4. MySQL里有2000w数据, redis中只存20w的数据,如何保证redis中的数据都是热点数据
  5. Memcache与Redis的区别都有哪些?
  6. Redis常见的性能问题都有哪些?如何解决?
  7. redis最适合的场景
  8. Redis的同步机制了解么?
  9. 是否使用过Redis集群,集群的原理是什么?
  10. redis集群如何保证一致性?

MySQL

  1. 主键超键候选键外键
    • 主键:
    • 超键:
    • 候选键:
    • 外键:
  2. 数据库事务的四个特性及含义
    • 原子性:要么全部成功,要么全部失败
    • 一致性:执行前和执行后必须处于一致性状态
    • 隔离性:多并发事务之间相互隔离
    • 持久性:事务提交后,数据的改变是永久性的
  3. 隔离级别,为什么使用隔离级别?
    • 由低到高一次为Read uncommitted(未授权读取,读未提交)、Read committed(授权读取,都提交)、Repeatable Read(可重复读)、 Serializable(序列化), 这四个级别可以逐个解释为 :脏读、不可重复读、幻读。
    • Read uncommitted(读未提交):如果一个事务已经开始写数据,则另一个事务则不允许进行写操作,但允许其他事务读此行数据。也就是说事务B读取了事务A未提交的数据。
    • Read Committed(读提交):读取数据的事务允许其他事务继续访问改行数据,但未提交的写事务将会禁止其他事务访问该行。避免了脏读,但可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
    • Repeatable Read(可重复读):同一个事务内,可多次读同一数据。
    • Serializable(序列化):事务序列化执行
隔离级别 脏读 不可重复读 幻读 第一类丢失更新 第二类丢失更新
Read UnCommitted 允许 允许 允许 不允许 允许
Read Committed 不允许 允许 允许 不允许 允许
Repeatable Read 不允许 不允许 允许 不允许 不允许
Serialiable 不允许 不允许 不允许 不允许 不允许
  1. 视图的作用,视图可以更改么?
    • 是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储
    • 单表视图一般用于查询和修改,会改变基本表的数据
    • 多表视图一般用于查询,不会改变基本表的数据
    • 作用:
      • 简化了操作,把经常使用的数据定义为视图
      • 安全性,用户只能查询和修改能看到的数据
      • 逻辑上的独立性,屏蔽了真实表的结构带来的影响
  2. drop,delete与truncate的区别
    • drop 直接删掉表
    • truncate删除的是表中的数据,再插入数据时自增长的数据id有重新从1开始
    • delete删除表中数据,可以后接where语句
  3. 索引的工作原理及其种类
    • 索引的实现通常使用B树及其变种B+树
    • 使用索引来聚集数据的索引是聚集索引,InnoDB就是聚集索引,MyISAM是非聚集索引。 MyISAM创建表时会创建三个文件:.frm(表结构) .MYD(数据文件) .MYI(索引文件)。 InnoDB创建表时生成两个文件: .frm(表结构) .idb(数据文件)
    • 聚集索引与辅助索引不同的是:叶子节点存放的是否是一整行的信息
      • 聚集索引:按照每张表的主键构造一棵B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称为数据页。每个数据页都通过一个双向链表来进行链接。
        • 好处:对主键的排序查找和范围查找速度非常快,叶子结点的数据就是用户所要查询的数据
        • 范围查询,由于B+树索引是双向链表,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可。
      • 辅助索引:叶子节点存放的是对应的那条数据的主键字段的值
      • 覆盖索引:在辅助索引的叶子结点上就能找到想要的数据,称为覆盖索引
    • 分类:
      • hash类型的索引:查询单条快,范围查询慢
      • btree类型的索引:B+树,层数越多,数量级指数增长
  4. 连接的种类
    • 内连接(Inner join): 两个表都存在匹配时,才返回行
    • 左连接(left join): 返回左表中的所有行,即使右表中没有匹配的行
    • 右连接(Right join): 返回右表中的所有行,即使左表中没有匹配的行
    • 全连接(Full join): 只要某一个表存在匹配,就返回行
    • 笛卡尔连接(Cartesian Join): 返回多表中记录集的笛卡尔积
  5. 数据库范式
    • 1NF第一范式:
      • 每一列属性都是不可再分的属性值,确保每一列的原子性
      • 两列的属性相近或者相似或一样,尽量个兵属性一样的列,确保不产生冗余数据
    • 2NF第二范式:
      • 每一行的数据只能与其中一列相关,即一行数据只做一件事,只要数据列中出现数据重复,就要把表拆分开来
    • 3NF第三范式:
      • 数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系
  6. 数据库优化的思路
    • 高并发读写操作: 集群,分布式
    • 海量数据读写: 分表,分库
    • 单机慢查询优化
      • 范式规范,3NF和反3NF
      • 存储引擎选择:
        • 事务安全:MyISAM不支持,InnoDB支持
        • 查询和添加速度:MyISAM快,InnoDB慢
        • 全文索引:MyISAM支持, InnoDB不支持
        • 锁机制:MyISAM表锁,InnoDB行锁
        • 外键:MyISAM不支持,InnoDB支持
      • 索引:以空间换时间
        • 分类
          • 普通索引
          • 唯一索引
          • 主键索引
          • 全文索引
        • 适合加索引条件
          • 较频繁作为查询条件字段应该创建索引
          • 唯一性太差字段不适合单独创建索引
          • 更新非常频繁的字段不适合创建索引
      • 分表: 水平分割(行)垂直分割(列)
      • 分区:
        • 方式:
          • Range(范围):基于一个给定的连续空间,把数据分配到不同分区
          • List(预定义列表):类型Range分区,区别在于是基于枚举出的值列表分区。
          • Hash: 通过一个或者多个列的Hash Key进行计算得到的不同数值进行分区
          • Key:Hash的特例,MySQL系统产生的
          • Composite(复合模式): 以上模式的组合使用
        • 空值的处理:
          • Range: 默认放入最小值分区
          • List: 必须指定Null值匹配
          • Hash:默认当成0
      • DQL:
        • 放弃索引: != <> is null or in not like模糊前置匹配
    • 集群:主从同步+读写分离+主备切换
    • 分布式:
    • 缓存:
  7. 存储过程与触发器的区别
    • 存储过程是一组已创建并存储在数据库中的SQL语句,可重用。 触发器是一种特殊的不是由用户直接调用的存储过程。
    • 用户可以使用Execute或Exec语句直接调用或执行存储过程,而无法直接调用执行触发器,触发相关事件时,自动执行。
    • 存储过程可输入参数,触发器不能
    • 存储过程可返回值,触发器不能
    • 存储过程中可以使用事务,触发器不允许进行事务处理
    • 存储过程通过用于执行用户指定的任务,触发器通常用于审计工作

JVM理论

  1. Java 内存分配?
  2. Java 堆的结构是什么样子的?
  3. 什么是堆中的永久代(Perm Gen space)?
  4. 简述各个版本内存区域的变化?
  5. 说说各个区域的作用?
  6. Java 中会存在内存泄漏吗,简述一下?
  7. Java 类加载过程?
  8. 描述一下 JVM 加载 Class 文件的原理机制?
  9. 什么是类加载器?
  10. 类加载器有哪些?
  11. 什么是tomcat类加载机制?
  12. 类加载器双亲委派模型机制?
  13. 什么是GC? 为什么要有 GC?
  14. 简述一下Java 垃圾回收机制?
  15. 如何判断一个对象是否存活?
  16. 垃圾回收的优点和原理,并考虑 2 种回收机制?
  17. 垃圾回收器的基本原理是什么?
  18. 垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
  19. 深拷贝和浅拷贝?
  20. System.gc() 和 Runtime.gc() 会做些什么?
  21. 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
  22. 什么是分布式垃圾回收(DGC)?它是如何工作的?

Java内存

1.1 对象优先在Eden区分配

目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法

  • 大多数情况下,对象在新生代中Eden区分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。
  • 新生代GC(Minor GC):发生新生代的来及收集动作,Minor GC非常频繁,回收速度一般比较快。
  • 老年代GC(Major GC/Full GC):发生在老年代的GC,出现Major GC经常会伴随最少一次的Minor GC(非绝对)Major GC的速度比Minor GC慢10倍以上。

深入理解JVM

  1. 运行时数据区域
    • Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区

JDK8新特性

1.接口默认方法(Default Methods for Interfaces)
  • Java 8能够通过使用default关键字向接口添加非抽象方法实现,此功能成为虚拟扩展方法
    1
    2
    3
    4
    5
    6
    interface Formula{
    double calculate(int a);
    default double sqrt(int a){
    return Math.sqrt(a);
    }
    }