面试记录1 2021年11月30日 10点

获取线程池执行的返回结果

线程池submit() Callable实现的线程,返回Future,通过get从中获取结果,可以设置获取超时时间,避免get一直阻塞

redis集群 6台机器

三主三从

集群和分布式的区别

集群主要是分担压力(n台机器,负载均衡后压力减少为1/n),保证高可用(一台机器挂了,其他机器仍提供服务)
分布式:各节点承担不同的任务,将任务分解,分别解决,最后协调合作,分布式的各个节点都可以采用集群部署

Redis缓存 数据库 一致性

双写一致性1
1)线程A发起一个写操作,第一步write DB
2)线程A第二步del cache
3)线程B发起一个读操作,cache miss
4)线程B从DB获取最新数据
5)线程B同时set cache

双写一致性2
1)读取缓存中是否有相关数据
2)如果缓存中有相关数据value,则返回
3)如果缓存中没有相关数据,则从数据库读取相关数据放入缓存中key->value,再返回
4)如果有更新数据,则先更新数据,再删除缓存
5)为了保证第四步删除缓存成功,使用binlog异步删除
6)如果是主从数据库,binglog取自于从库
7)如果是一主多从,每个从库都要采集binlog,然后消费端收到最后一台binlog数据才删除缓存

先更新db,再删除缓存

线程生命周期

NEW RUNNABLE BLOOCKED WAITING TIME_WAITING TERMINATED


等待和阻塞的区别
从图中可以看出:
等待有两种,普通等待和超时等待,通过wait方法进入等待态,通过notify方法进入就绪态,获取系统分配的时间片后进入运行态,超时等待则是为了避免等待时间过长或者无止境的等待。ps:就绪态是操作系统层面的,在jvm中就绪和运行统称为runnable态!!!
阻塞则是调用同步方法,没有获取到锁的时候就会进入阻塞态,需要获取对应的锁才能继续执行。
wait是主动停下来,阻塞是不得不停下来

MVCC 多版本并发控制

innodb实现可重复读,如果采用一致性非锁定读,则读第一次查询前所插入的数据,如果采用当前读,则加Next-key Lock。

复合索引失效情况

复合索引遵循最左前列原则。从最左索引开始且不能跳过中间索引,跳过中间索引,其后的索引会失效。
范围索引之后的索引会失效。
函数和自动类型转化使索引失效
运算符号使得索引失效
前导模糊查询会使索引失效 '%java'、'%java%'失效。'java%'有效。如果一定要使用左前导模糊查询,可以建立覆盖索引。

SpringBoot自动装配

@SpringBootApplication下面的
@SpringBootConfiguration声明为配置类
@Component 扫描主程序入口及其子包中的组件
@EnableAutoConfiguration 自动装配的核心,通过一个 AutoConfigurationImportSelector 自动装配导入选择器,加载spring-factories中的全限定类名,再更加Condition注解,反射注册bean组件

Spring注册bean的方式

@Autowird
field
setter
construcor

@Bean
method

@ComponentScan(Packages)

Spring推荐使用哪种方式注册Bean

推荐使用构造器

@Controller
public class FooController {
  private final UserService userService;
  @Autowired
  public FooController(UserService userService) {
      this.userService = userService;
  }
}

依赖不可变:final
依赖不为空:无UserService 传入时会报错
完全初始化:依赖不为空,所以依赖的构造方法会先调用
提供复用率:IOC容器外也可通过构造器创建实例,用filed注入,如果时private属性则只能用反射才能创建依赖
避免了循环依赖

posted @ 2021-11-30 11:56  GitHub-ahao  阅读(24)  评论(0)    收藏  举报