总结一下软通外派阿里的面试题

前段时间,面了几家大外派到阿里的项目,所以和大家分享一下面试题

上来就是老套路
面试官:说下你们项目的流程
果咩: 巴拉巴拉。。。。

面试官:你们项目如何使用redis高可用的

果咩:可以使用哨兵模式和Cluster集群

面试官:那你讲一下哨兵模式吧

果咩:当我们的主机master宕机之后,我们的slave会等待我们的master上线,再次期间不会进行任何操作,这个时候我们可以手动的进行主机切换,将我们其中的一台从机slaver装换成我们的主机master,当原来的master恢复重新上线的时候,会自动沦为从机slave,可是我们无法知道redis什么时候宕机,所以我们需要他们自动的监控和进行主从切换,而哨兵提供了这些功能,监控,通知和自动的故障转移,最常见的哨兵模型就是一主二从三哨兵

面试官:使用三个哨兵会不会浪费?

果咩:不会,在哨兵模式下,我们需要奇数个哨兵,因为当主机宕机之后哨兵会去判断master是否宕机,在哨兵集群下进行投票,当投票数超过设定的值的时候会进行从机slave选举成为master,所以我们最少需要三台哨兵去监控我们的主机

面试官:说一下redis的持久化

果咩:持久化方式主要有两种,rdb和aof

rdb是redis默认的持久化方式,在指定的时间间隔内将内存中的数据集快照(Snapshot)写入磁盘的二进制文件,所产生的也就是dump.rdb文件,它恢复时是将快照文件直接读到内存里。

aof是以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,

面试官:知道如何实现分布式锁吗

果咩:我知道的有两种方式,一个是redis,另一个是zk,我对redis比较了解,我就说一下redis如何实现分布式锁吧

单机模式下可以使用setnx 去设置锁,设置成功,返回 1 ;设置失败,返回 0 。 (挖坑,让他有下面的提问)

在集群模式下使用redlock去实现分布式锁(这个我没回答上来,后面会进行学习)

面试官:使用setnx会不会出现什么问题

果咩:不设置过期时间,宕机后会变成死锁,为了保证操作的原子性,我们可以使用SET key value NX PX 30000命令,在java是这样实现的

     //jedis为例找到如下参数的 nxxx 改成nx,expx改成px 
     set(final String key, final String value, 
         final String nxxx, final String expx,final int time) 

面试官:那删除key的时候怎么办

果咩:删除的时候可以使用lua脚本语言保证删除过程的原子性,在删除的时候要先判断value值是否一样

面试官:那你写过lua表达式吗?

果咩:没有。。。(害,这个还真没写过,后面继续学习)

面试官:讲一下缓存雪崩和缓存穿透

果咩:
雪崩就是在大量redis突然失效的时候,请求在缓存无法获取进而去访问数据库,数据库压力过大导致服务器宕机的行为

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

面试官:那你有什么办法解决缓存雪崩吗

果咩:尽量保证大量的key的失效时间不在同一时间段内,保证缓存的高可用,避免单点缓存宕机

面试官:还有其他方法吗?

果咩:这里我说的是利用redis的数据淘汰策略(希望大佬指点一下)

面试官:解决缓存穿透呢?

果咩:将那些不存在的值也放进缓存中,或者使用布隆过滤器

面试官:那你说一下redis为什么执行单线程的还怎么快

果咩:

  • 采用了多路IO复用,多路指的是多个连接,复用是使用同一个线程
  • 基于内存,而内存的读写速度非常快
  • 单线程减少了上下文切换线程的时间

面试官:redis 的String的容量是多大

果咩:额。。。这个。。。不太清楚
(这个当时没回答上了 ,后面查阅知道是512M)

redis终于结束了!

面试官:jvm为什么采用分带收集

果咩:我们根据不同的年代选择适合的垃圾回收算法

比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集

面试官:类加载机制是什么

果咩:将我们编译好的.class文件加载到内存当中,将静态数据放进方法区内,并在堆中创建对象,用来封装方法区中的数据结构,并提供了访问数据的入口

类的加载过程包括了加载、验证、准备、解析、初始化五个阶段。

面试官:双亲委派是什么?

果咩:当一个类需要加载的时候,会先交给父类加载器去完成,当父类无法加载的时候,才交给子类去加载,保证了不同类加载器最终得到的是同一个对象,也同时避免了重复加载

面试官:关于eureka你们用来做什么了

果咩:服务注册和发现
面试官 : 就这???
大佬们,eureka到底还能用来干点啥??

面试官:说一下你boot都用过什么注解吧

果咩:首先是启动类 @SpringBootApplication

配置文件注解@Configuration

包扫描注解@ComponentScan

自动注入@AutoWired

@RestController,@RequestMapping,@Service,@Bean,@Value

面试官:你知道bean都是怎么注入的吗?

果咩:关于ioc的注入,基于xml bean的配置和@controller等注解,包扫描进行ioc注入

bean之间的依赖注入可以通过setter,构造器,工厂模式进行注入
手动进行依赖装配过多会导致不易管理,所以我们可以使用注解的方式进行自动装配进行注入,比如@Autowire 和@Resource

面试官:说一下@Autowired和@Resource的区别

果咩:

  • @Autowired是spring的 @resource是jdk的
  • @Autowired默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置 required属性为false,如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;
  • @Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.

面试官:嗯好 ,今天我们就先聊这么多,后续通过的话会有阿里找你进行二面
我:好的好的,谢谢您

这就是我的一场初面的面试题,后续还有其他的面试问题 等我整理出来分享给大家
我这有一份关于java的面试题,大家可以关注我的公众号 **果咩z**(在最下方!),回复:**java面试题** 来领取

java面试题
java面试题

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值