面试总结
1.项目问题
# 为了减轻由于频繁操作对数据库造成的压力,所以在用户关注功能使用redis技术实现
如果是关注: 就添加两个集合 :
对于作者: zadd follow : 登录人 作者
对于粉丝: zadd fans : 作者 登录人
如果是取消关注:
对于作者 zrem follow : 登录人 作者
对于粉丝 zrem fans : 作者 登录人
# 文章点赞存储到哪?怎么储存的?
存储到MongoDB中,+1
# 项目中有没有设计到数据库表
头条中得静态资源添加了一个字段用来存储静态资源地址
0.Java基础
HashTable 和 ConcurrentHashMap 区别
HashTable 使用的是 Synchronized 关键字修饰,ConcurrentHashMap 是JDK1.7使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。
synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。
1.Spring
1.Spring常用注解
1. @Component(任何层) @Controller @Service @Repository(dao): 用于实例化对象
2. @Scope : 设置Spring对象的作用域
3. @PostConstruct @PreDestroy : 用于设置Spring创建对象在对象创建之后和销毁之前要执行的方法
4. @Value: 简单属性的依赖注入
5. @Autowired: 对象属性的依赖注入
6. @Qualifier: 要和@Autowired联合使用,代表在按照类型匹配的基础上,再按照名称匹配。
7. @Resource 按照属性名称依赖注入
8. @ComponentScan: 组件扫描
9. @Bean: 表在方法上,用于将方法的返回值对象放入容器
10. @PropertySource: 用于引入其它的properties配置文件
11. @Import: 在一个配置类中导入其它配置类的内容
12. @Configuration: 被此注解标注的类,会被Spring认为是配置类。Spring在启动
2.@Resource和@Autowired依赖注入的区别是什么
@Resource
只能放在属性上,表示先按照属性名匹配IOC容器中对象id给属性注入值若没有成功,会继续根据当前属性的类型匹配IOC容器中同类型对象来注入值
若指定了name属性@Resource(name = "对象id"),则只能按照对象id注入值。
@Autowird
放在属性上:表示先按照类型给属性注入值如果IOC容器中存在多个与属性同类型的对象,则会按照属性名注入值
也可以配合@Qualifier("IOC容器中对象id")注解直接按照名称注入值。
放在方法上:表示自动执行当前方法,如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值
也可以在参数上添加@Qualifier("IOC容器中对象id")注解按照名称寻找对象给参数传值。
3.使用AOP得场景除了事务
@Aspect//指定当前类为切面类
//抽取切入点
//定义环绕通知 实现统计切入点指定方法
@Around("logPointcut()")
4.springboot会有一个循环依赖你知道什么是循环依赖么?怎么解决呢?
# Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖
解决方案:最好的方法是重构代码,进行解耦
或者
配置文件中,在互相依赖的两个bean的任意一个加上lazy-init属性
互相依赖的两个bean上加上@Lazy注解也可以
5.MVCC?MVCC怎么生成这个快照有了解过么?
# MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
2.Mybatis
在mybatis中,${} 和 #{} 的区别是什么?
#{} 是占位符,预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
# Order By 后面使用的是 #{} ${}?
是 ${}
3.SQL优化
1.项目中SQL语句很慢是怎么优化的,具体优化方案
# 先通过慢查询日志分析
id**(重要)
**id值相同**
执行顺序由上到下
**id不同**
如果是子查询,id的序号会递增,id值越大优先级越高,优先被执行
**id相同不同,同时存在**
可以认为是一组,从上往下顺序执行
在所有组中,id值越大,优先级越高,越先执行
type** (重要)
结果值:(最好到最差) system > const > eq_ref > ref > range > index > ALL
一般来说,保证查询至少达到range级别
最好能达到ref
**key**
实际使用的索引,如果为NULL,则没有使用索引,查询中若使用了覆盖索引 ,则该索引仅出现在key列表
Extra** (重要)
语句中出现了Using Filesort 和 Using Temporary说明没有使用到索引
出现 impossible where说明条件永远不成立
# 优化使用索引 和 left join
多表查询中,一定要让小表驱动大表
2.避免索引失效
-- 最左匹配原则 *
-- 范围条件右边的索引失效
-- 不再索引列上做任何操作 *
-- 使用不等于(!=或者<>)索引失效
-- is not null无法使用索引
-- like以通配符开头(%qw)索引失效 *
-- 字符串不加引号索引失效
-- 使用or连接索引失效
-- 尽量使用覆盖索引
5.Nginx是什么?
# 高性能的HTTP和反向代理服务器,非常高效的反向代理、负载均衡
# 作用:反向代理、负载均衡、动静分离
6.Redis是什么
# 非关系型数据库(基于C写的)非关系型数据库,基于内存,结构简单是单线程的,可以用来存储数据、消息队列、注册中心
7.MongoDB是什么?
# 文档型的非关系型数据库,是开源、高性能、高可用、底层是倒排索引的
8.什么是kafka
# kafka是一个分布式流处理框架,用于实时构建流处理应用,核心功能是作为企业级的消息引擎
# 特点:高吞吐量(10万级别是MQ中最高的) 延迟低(毫秒,扩展性强,持久性可靠性一般,高并发(支持数千个客户端同时读写)
9.什么是Mycat
# 一个非常新颖的数据库中间件,支持事务,ACID,可以替代Mysql的加强版数据库,用来代替Oracle
10.什么是Hbase
# 分布式的基于列式存储的数据库,Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章的数据
11.FastDFS是什么?
# 一个开源的分布式系统文件,可以对文件进行管理,功能:文件存储,文件同步,文件访问等解决了大容量存储和负载均衡,一般用作相册网站,视频网站