redis 处理socket ready 事件是单线程执行的, 也就是说redis一次只会处理一个socket, 避免了并发所带来的资源竞争问题, 可以用来实现分布式锁.
具体实现思路: 通过SETNX尝试设值(currentTimestamp + timeout), 如果设置成功, 说明类似获取锁操作成功, 失败则获锁失败. 获锁成功的线程在处理完业务之后要手动释放锁DEL key. 由于各种不稳定因素的存在会导致获锁客户端无法释放锁, 会造成死锁, 比如服务宕机, 网络延迟等原因. 因此在SETNX失败后, 需要GET获取val既currentTimestamp + timeout 判断当前时间是否大于该值, 大于说明此锁已无效, 要么DEL, 要么重新set, DEL的话存在问题,如果直接DEL key, 再SETNX, 在并发情况下会导致SETNX成功后被后一个线程DEL, 因此建议使用GETSET, 通过比较返回值和GET 获取的旧值比较, 相同则说明获取成功, 失败则说明已被其他线程获取成功.
由于处理业务时间可能较长, 导致锁被认为invalid, 因此需要在处理过程中检测currentTimestamp + timeout, 重新设置此值.
redis实现分布式锁思路
最新推荐文章于 2023-10-16 09:56:16 发布