面试题答案
一键面试1. 锁超时问题
- 问题分析:在高并发场景下,当某个客户端获取到锁后,如果执行任务的时间超过了设置的锁超时时间,那么锁会自动释放。此时,其他客户端可能会获取到该锁,导致同一时间有多个客户端执行临界区代码,破坏数据一致性。
- 解决方案:
- 延长锁的超时时间:在获取锁时,根据任务预计执行时间,合理设置一个较长的锁超时时间。但这种方法可能会导致在任务执行完后,锁长时间不释放,影响其他客户端获取锁的效率。
- 使用“看门狗”机制:在获取锁的客户端中启动一个后台线程(或定时器),在锁快要过期时,如果任务还未执行完,自动延长锁的有效期。例如在Java中可以使用
Redisson
框架,它内部实现了看门狗机制,会在锁快要过期时,自动续约。
2. 惊群效应
- 问题分析:当Redis的分布式锁释放时,大量等待获取锁的客户端会同时收到通知去竞争锁,瞬间产生高并发请求,可能会对Redis服务器造成较大压力,甚至导致服务器性能下降或崩溃。
- 解决方案:
- 使用公平锁:可以通过Redis的有序集合(Sorted Set)来实现公平锁。每个客户端在尝试获取锁时,向有序集合中添加一个带有唯一标识和时间戳的成员,通过比较成员的顺序来决定获取锁的先后顺序。这样可以避免所有客户端同时竞争锁,而是按照顺序依次获取锁。
- 随机延迟重试:当客户端获取锁失败后,不是立即重试,而是等待一个随机的时间后再重试。这样可以分散客户端重试的时间点,避免大量客户端同时竞争锁,减轻Redis服务器的压力。例如,在Java中可以使用
Thread.sleep((long)(Math.random() * 1000))
来实现随机延迟。