分布式锁实现方式

2025-02-05

分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。

分布式锁实现方案

方案

说明

数据库

基于表的唯一 一索引

zookeeper

根据zookeeper中的临时有序节点排序

redis

使用SETNX命令完成

redis:分布式锁

  • 借助redis实现分布式锁可使用使用SETNX命令完成

  • sexnx(SET if Not Exists)命令在指定的key不存在时,为key设置指定的值。不存在则设置值

如下图,当客户端A先请求服务端设置key,即加锁,key存在就说明资源被占用,此时客户端B再申请,发现key存在,将无法获得zi'yuan

image-qjpv.png

代码实现

/**
 * 加锁
 *
 * @param name
 * @param expire
 * @return
 */
public String tryLock(String name, long expire) {
    name = name + "_lock";
    String token = UUID.randomUUID().toString(); // 锁
    RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
    RedisConnection conn = factory.getConnection();
    try {

        //参考redis命令:
        //set key value [EX seconds] [PX milliseconds] [NX|XX]
        Boolean result = conn.set(
                name.getBytes(),
                token.getBytes(),
                Expiration.from(expire, TimeUnit.MILLISECONDS), // 设置过期时间,防止产生死锁
                RedisStringCommands.SetOption.SET_IF_ABSENT //NX
        );
        if (result != null && result)
            return token;
    } finally {
        RedisConnectionUtils.releaseConnection(conn, factory,false);
    }
    return null; // 键已存在,已上锁,返回空
}

NEXT
SpringBoot应用集成测试