面试总结

1.项目问题

  1. # 为了减轻由于频繁操作对数据库造成的压力,所以在用户关注功能使用redis技术实现
  2. 如果是关注: 就添加两个集合
  3. 对于作者: zadd follow : 登录人 作者
  4. 对于粉丝: zadd fans : 作者 登录人
  5. 如果是取消关注:
  6. 对于作者 zrem follow : 登录人 作者
  7. 对于粉丝 zrem fans : 作者 登录人
  8. # 文章点赞存储到哪?怎么储存的?
  9. 存储到MongoDB中,+1
  10. # 项目中有没有设计到数据库表
  11. 头条中得静态资源添加了一个字段用来存储静态资源地址

0.Java基础

HashTable 和 ConcurrentHashMap 区别

  1. HashTable 使用的是 Synchronized 关键字修饰,ConcurrentHashMap JDK1.7使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap取消了Segment分段锁,采用CASsynchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。
  2. synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。

1.Spring

1.Spring常用注解

  1. 1. @Component(任何层) @Controller @Service @Repositorydao): 用于实例化对象
  2. 2. @Scope : 设置Spring对象的作用域
  3. 3. @PostConstruct @PreDestroy : 用于设置Spring创建对象在对象创建之后和销毁之前要执行的方法
  4. 4. @Value: 简单属性的依赖注入
  5. 5. @Autowired: 对象属性的依赖注入
  6. 6. @Qualifier: 要和@Autowired联合使用,代表在按照类型匹配的基础上,再按照名称匹配。
  7. 7. @Resource 按照属性名称依赖注入
  8. 8. @ComponentScan: 组件扫描
  9. 9. @Bean: 表在方法上,用于将方法的返回值对象放入容器
  10. 10. @PropertySource: 用于引入其它的properties配置文件
  11. 11. @Import: 在一个配置类中导入其它配置类的内容
  12. 12. @Configuration: 被此注解标注的类,会被Spring认为是配置类。Spring在启动

2.@Resource和@Autowired依赖注入的区别是什么

  1. @Resource
  2. 只能放在属性上,表示先按照属性名匹配IOC容器中对象id给属性注入值若没有成功,会继续根据当前属性的类型匹配IOC容器中同类型对象来注入值
  3. 若指定了name属性@Resource(name = "对象id"),则只能按照对象id注入值。
  4. @Autowird
  5. 放在属性上:表示先按照类型给属性注入值如果IOC容器中存在多个与属性同类型的对象,则会按照属性名注入值
  6. 也可以配合@Qualifier("IOC容器中对象id")注解直接按照名称注入值。
  7. 放在方法上:表示自动执行当前方法,如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值
  8. 也可以在参数上添加@Qualifier("IOC容器中对象id")注解按照名称寻找对象给参数传值。

3.使用AOP得场景除了事务

  1. @Aspect//指定当前类为切面类
  2. //抽取切入点
  3. //定义环绕通知 实现统计切入点指定方法
  4. @Around("logPointcut()")

4.springboot会有一个循环依赖你知道什么是循环依赖么?怎么解决呢?

  1. # Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖
  2. 解决方案:最好的方法是重构代码,进行解耦
  3. 或者
  4. 配置文件中,在互相依赖的两个bean的任意一个加上lazy-init属性
  5. 互相依赖的两个bean上加上@Lazy注解也可以

5.MVCC?MVCC怎么生成这个快照有了解过么?

  1. # MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

2.Mybatis

在mybatis中,${} 和 #{} 的区别是什么?

  1. #{} 是占位符,预编译处理,${}是字符串替换。
  2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatementset方法来赋值;
  3. Mybatis在处理${}时,就是把${}替换成变量的值。
  4. 使用#{}可以有效的防止SQL注入,提高系统安全性。
  5. # Order By 后面使用的是 #{} ${}?
  6. ${}

3.SQL优化

1.项目中SQL语句很慢是怎么优化的,具体优化方案

  1. # 先通过慢查询日志分析
  2. id**(重要)
  3. **id值相同**
  4. 执行顺序由上到下
  5. **id不同**
  6. 如果是子查询,id的序号会递增,id值越大优先级越高,优先被执行
  7. **id相同不同,同时存在**
  8. 可以认为是一组,从上往下顺序执行
  9. 在所有组中,id值越大,优先级越高,越先执行
  10. type** (重要)
  11. 结果值:(最好到最差) system > const > eq_ref > ref > range > index > ALL
  12. 一般来说,保证查询至少达到range级别
  13. 最好能达到ref
  14. **key**
  15. 实际使用的索引,如果为NULL,则没有使用索引,查询中若使用了覆盖索引 ,则该索引仅出现在key列表
  16. Extra** (重要)
  17. 语句中出现了Using Filesort Using Temporary说明没有使用到索引
  18. 出现 impossible where说明条件永远不成立
  19. # 优化使用索引 和 left join
  20. 多表查询中,一定要让小表驱动大表

2.避免索引失效

  1. -- 最左匹配原则 *
  2. -- 范围条件右边的索引失效
  3. -- 不再索引列上做任何操作 *
  4. -- 使用不等于(!=或者<>)索引失效
  5. -- is not null无法使用索引
  6. -- like以通配符开头(%qw)索引失效 *
  7. -- 字符串不加引号索引失效
  8. -- 使用or连接索引失效
  9. -- 尽量使用覆盖索引

5.Nginx是什么?

  1. # 高性能的HTTP和反向代理服务器,非常高效的反向代理、负载均衡
  2. # 作用:反向代理、负载均衡、动静分离

6.Redis是什么

  1. # 非关系型数据库(基于C写的)非关系型数据库,基于内存,结构简单是单线程的,可以用来存储数据、消息队列、注册中心

7.MongoDB是什么?

  1. # 文档型的非关系型数据库,是开源、高性能、高可用、底层是倒排索引的

8.什么是kafka

  1. # kafka是一个分布式流处理框架,用于实时构建流处理应用,核心功能是作为企业级的消息引擎
  2. # 特点:高吞吐量(10万级别是MQ中最高的) 延迟低(毫秒,扩展性强,持久性可靠性一般,高并发(支持数千个客户端同时读写)

9.什么是Mycat

  1. # 一个非常新颖的数据库中间件,支持事务,ACID,可以替代Mysql的加强版数据库,用来代替Oracle

10.什么是Hbase

  1. # 分布式的基于列式存储的数据库,Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章的数据

11.FastDFS是什么?

  1. # 一个开源的分布式系统文件,可以对文件进行管理,功能:文件存储,文件同步,文件访问等解决了大容量存储和负载均衡,一般用作相册网站,视频网站