【Java 面试攻坚】微服务架构中的分布式锁实现:Redis vs Zookeeper

一 、引入场景:

面试官:“在微服务架构中,如果多个实例同时修改一个共享资源,会造成数据不一致问题。那么,你会如何设计一个方案来解决这个问题呢?”
求职者(满怀自信):“嗯……我会用分布式锁来保证资源的一致性,阻止多个服务实例同时访问关键资源。”
面试官(进一步引导):“很好!那么你知道什么是分布式锁吗?有哪些实现方案?”
求职者(语气稍显轻快):“啊哈,这个问题说来话长。分布式锁可以基于多个工具实现,比如Redis、Zookeeper……各自有优劣,需要结合场景解决我们的问题。”

分布式锁是面试中的高频技术点,在高并发分布式场景中对资源一致性问题的处理尤为重要。本文我们将深入分析。


二、 什么是分布式锁?为什么需要它?

🌟 背景:

在微服务架构中,多个服务实例同时访问共享资源(如商品库存、用户会话等)时,有可能因为竞争关系导致 数据冲突一致性问题。传统的本地锁难以满足分布式系统需求,因此需要分布式锁的介入。

🌟 要求:

分布式锁通常需要满足以下属性:

  • 互斥性:只允许一个客户端持有锁,其它客户端必须阻塞。
  • 高可用性:即使部分服务或节点崩溃,锁仍然可用。
  • 可重入性:同一客户端可以多次获得锁,不会因再次加锁被自己阻塞。

三、 常见分布式锁实现方式

🟠 基于 Redis 的分布式锁

Redis是高并发项目中常用的分布式缓存工具,基于其特性,可以实现分布式锁机制:

实现原理:

使用 SETNX (SET if Not Exists) 命令保证互斥性,并用 EXPIRE 实现超时删除避免死锁。

import redis.clients.jedis.Jedis;

public class RedisLock {
    private Jedis jedis;

    public RedisLock(Jedis jedis) {
        this.jedis = jedis;
    }

    public boolean tryLock(String lockKey, String clientId, int expireTime) {
        // 使用SETNX,返回 1 表示获得锁,返回 0 表示锁已存在
        String result = jedis.set(lockKey, clientId, "NX", "PX", expireTime);
        return "OK".equals(result);
    }

    public void releaseLock(String lockKey, String clientId) {
        // 确保释放锁时持有锁的同时验证锁信息
        String currentValue = jedis.get(lockKey);
        if (clientId.equals(currentValue)) {
            jedis.del(lockKey);
        }
    }
}
优点:
  • 高效、性能优越,适合短时间锁场景。
缺点:
  • 存在实现复杂度,如高并发场景下死锁问题(需 RedLock 机制支持)。

🟠 基于 Zookeeper 的分布式锁

Zookeeper 是分布式协调服务,其 节点有序性会话超时 的特性使其能实现分布式锁:

实现原理

使用 Zookeeper 的临时顺序节点机制完成锁的抢占和释放。

代码实现:
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;

public class ZookeeperLock {
    private final InterProcessMutex lock;

    public ZookeeperLock(CuratorFramework client, String path) {
        this.lock = new InterProcessMutex(client, path);
    }

    public void lock() throws Exception {
        lock.acquire();
    }

    public void unlock() throws Exception {
        lock.release();
    }
}
优点:
  • 数据一致性更强,适合较长时间锁场景。
缺点:
  • 性能稍逊,锁创建销毁时耗时较高。

四、Redis vs Zookeeper 实现对比

| 特性 | Redis | Zookeeper |
|---------------|-------------------------------|-----------------------------|
| 性能效率 | 高(适合短时间锁) | 较低(适合长时间锁) |
| 数据一致性保障 | 较弱,需要 RedLock 协议支持 | 强一致性,天然支持 |
| 实现复杂度 | 依赖开发实现 | Curator 框架便捷封装 |
| 适用场景 | 秒杀系统、库存管理 | 分布式事务协调、会话锁 |


五、总结与建议

  • 如果业务场景强调 性能高频短操作,如商品抢购,优先选择 Redis 分布式锁。
  • 如果更注重 数据一致性长时间锁需求(如分布式事务协调),建议使用 Zookeeper
  • 综合考虑业务特点,平衡性能实现与一致性保障,选择合适的工具方案。

更多推荐