前段时间,面了几家大外派到阿里的项目,所以和大家分享一下面试题
上来就是老套路
面试官:说下你们项目的流程
果咩: 巴拉巴拉。。。。
面试官:你们项目如何使用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为什么执行单线程的还怎么快
果咩:
面试官: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的区别
果咩:
面试官:嗯好 ,今天我们就先聊这么多,后续通过的话会有阿里找你进行二面
我:好的好的,谢谢您