JAVA 分布式项目常见面试题搜集

1.Redis保证热点数据

使用redis的数据淘汰策略
在线更新配置 /apps/svr/redis/bin/redis-cli -p 6921 config set maxmemory-policy volatile-lru
一共五种更新策略:
1.volatile-lru 利用lru策略对使用时间最早的,使用次数最少的key并且设置了过期时间的Key进行淘汰
2.allkeys-lru 利用lru策略对使用时间最早的,使用次数最少的Key进行淘汰
3.volatile-random 随机淘汰设置过期时间的key
4.allkeys-random 随机淘汰key
5.volatile-ttl 淘汰剩余有效期最短的key

2.假设一个接口接收10个请求,判断总完成的时间

可以使用completableFuture接口,每一个请求建立一次supplyAsync/runyAsync, 等待完成后调用complete回调函数计算每次请求的结束时间。

3.假设一个学生实体类中有姓名,年龄,性别几个字段,在一个集合中有10个学生类,如何按年龄排序

使学生类实现comparator接口,重写compare方法

4.如何保证接口的安全性

1.使用token验证
2.使用第三方如spring security, shiro等安全框架

5.什么是CAS算法,有什么作用?

含义:比较并替换。实现CAS需要三个数,内存地址值、旧的预期值、新的替换值,在对变量进行操作前需要先用内存地址值和旧的期望值做出比较,如果相同才会将值替换为新的值。
作用:保证操作的原子性
缺点:
1.如果循环次数过多开销很大
2.只能保证单个共享变量的原子性
3.ABA问题
ABA问题:意思就是当内存地址值A去对比旧的预期值A一样时,认为可以修改成新的替换值,但实际上地址值已经被改变过B然后又被改变成了A,而CAS操作会误认为他没有被改变过,这就是ABA问题。
JAVA如何解决ABA问题:使用AtomicStampedReference加上版本戳。

6.重写equals方法时为什么要重写hashcode方法

在将对象存入例如hashset,hashmap等不允许重复的集合中时,为了效率会先比较hashcode,然后比较equals,使用hashcode进行提前校验,可以提高效率。
如果不重写hashcode,也有可能会出现equals相等,hashcode不相等的情况。

7.spring如何控制事务

分为编程式事务和声明式事务,一般使用声明式事务
声明式事务分为3中:
1.基于TransactionProxyFactoryBean代理的声明式事务控制,为目标类配置事务和代理对象,在使用中不再使用当前类的实力而是代理类的实例,比较麻烦
2.AOP声明式事务:使用AOP将事务管理织入目标类
3.注解式事务,在目标类上添加@Transactional注解

8.Hystrix的开关状态和工作原理简单说明

Hystrix是通过比较当前服务健康状态和设置的阈值比较后确定开关状态的
服务健康状态 = 请求失败数 / 请求总数
当开关为关时,请求被允许通过熔断器,(服务器执行请求,如果执行失败,请求数失败数+1,请求总数+1,此时的健康状态就是当前的请求失败数/请求总数,相当于比值增加,有可能超过设定阈值,如果成功相当于比值减小,则必然不可能超过设置阈值)如果此时的健康状态大于阈值,继续保持关状态。如果小于,则转为开状态,拒绝一切请求。在一定时间后,将状态改为半开状态,半开状态时会允许一次请求通过,如果失败,则继续开启开关,如果成功,则将开关关闭

9.hashMap的原理的简述

hashmap是一个线程不安全的,由数组,链表和红黑树构成的容器。
初始容量为16,默认加载因子为0.75,每次扩容为当前容量的2倍,(当插入的元素数量 > 容量 * 加载因子时,自动扩容)
元素会根据key的hashcode值再进行hash然后和数组长度取模进行均匀分布
hashmap中存储的key value键值对其实是以Entry数组形式存储的,每一个Entry是一个列表,用来解决hash冲突,当链表中的元素大于阈值8时,转为红黑树存储。

10. 红黑树,b+树原理,数据库为什么选择b+

11.Redis为什么快

1.redis是存储在内存中的,速度自然比硬盘快得多
2.redis是单线程的,不需要进行上下文切换,不需要加锁,因为不会有并发问题
3.redis数据结构简单
4.采用了多路I/0复用模型,非阻塞I/O