分布式锁实现

Redis 分布式锁

public class RedisDistributedLock {
    private final StringRedisTemplate redisTemplate;
    private static final String LOCK_PREFIX = "lock:";
    private static final long DEFAULT_EXPIRE = 30000;
    
    public boolean tryLock(String key, long expire) {
        String lockKey = LOCK_PREFIX + key;
        Boolean result = redisTemplate.opsForValue()
            .setIfAbsent(lockKey, UUID.randomUUID().toString(), expire, TimeUnit.MILLISECONDS);
        return Boolean.TRUE.equals(result);
    }
    
    public void unlock(String key) {
        String lockKey = LOCK_PREFIX + key;
        redisTemplate.delete(lockKey);
    }
}

Redisson 分布式锁(推荐)

@Service
public class DistributedLockService {
    @Autowired
    private RedissonClient redissonClient;
    
    public boolean tryLock(String lockKey, long waitTime, long leaseTime) {
        RLock lock = redissonClient.getLock(lockKey);
        try {
            return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return false;
        }
    }
    
    public void unlock(String lockKey) {
        RLock lock = redissonClient.getLock(lockKey);
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

Zookeeper 分布式锁

// Curator 框架实现
public class ZkDistributedLock {
    private final CuratorFramework client;
    private static final String LOCK_PATH = "/locks/";
    
    public void acquire(String lockName) throws Exception {
        String lockPath = LOCK_PATH + lockName;
        InterProcessMutex mutex = new InterProcessMutex(client, lockPath);
        mutex.acquire();
    }
    
    public void release(String lockName) throws Exception {
        String lockPath = LOCK_PATH + lockName;
        InterProcessMutex mutex = new InterProcessMutex(client, lockPath);
        mutex.release();
    }
}

Redis vs Zookeeper 分布式锁对比

特性RedisZookeeper
实现方式SETNX + expire临时顺序节点
性能高(纯内存)中(需写磁盘)
可靠性需处理锁续期CP 强一致性
公平性非公平(默认)公平(顺序节点)
复杂度
适用场景高并发、允许短暂不一致强一致性要求

参考链接