一、机试
1.华为真题考察对优先队列的使用
安排会议室问题,给定F层的房子,每层M个会议室,有N组人每组需要的楼层分别有R,以及每组的人数P,需要在R及R以下去分配这些会议室
首先要判断总的会议室,然后要逐个去每层去处理一个来放入队列,队列里是存放的人最多的组,放在尽可能高的位置。
vector vector int存储的是对每层的要求的那些组。
2.华为真题考察stack
询问最小的值,也就是支持最小值的stack,通过两个栈实现,然后主要需要注意的边界条件就是空的情况
3.力扣关于dfs的问题:岛屿数量
对于每个岛屿把它的联通的值都设置成0
二、Redis有关的知识
1.原子性
原子性操作的一种方式是使用加锁解锁的方式,不足之处是会降低并发性。
一种解决方法是使用原子加和原子减操作,另一种是使用lua脚本,lua脚本会保证原子性。
2.Redis是如何实现分布式锁的?
分布式锁是根据Redis中的key来标记,然后通过value值判断是否加锁成功。为了防止一个进程加的锁被另一个进程delete,可以不把加锁的value设成1而是设置成一个独特的值,独特的值可以用来验证,在具体的解锁加锁的过程中可以使用lua脚本,先判断,再解锁。
setnx命令如果不存在key就会创建,也就是加锁成功,如果存在则不会设置成功。
为了保证高可用,可以使用多节点的Redis锁,在申请锁的过程中只有在超过一半的节点申请成功才表示加锁成功。这样可以支持实例崩溃下仍然加锁成功。
为了防止申请锁的客户端断开连接或者因为其他原因崩溃无法释放锁,其他人无法使用,对锁设置一个过期时间,所以申请的时间如果直接超过了这个时间锁也是无效的。
总结:今天主要学习的内容是关于分布式锁的实现,之前在面经好像看到过好几次了。