spring boot 下Redis 实现分布式锁

1.  依赖引入:

redis.clients

jedis

2.9.0

2.  application.yml 配置 Redis连接:

spring:

redis:

host: 172.19.125.149

password: 123456

port:6379


3. 正确代码:

public class RedisTool {

private static final StringLOCK_SUCCESS ="OK";

private static final StringSET_IF_NOT_EXIST ="NX";

private static final StringSET_WITH_EXPIRE_TIME ="PX";

/**

    * 尝试获取分布式锁

    * @param jedis Redis客户端

    * @param lockKey 锁

    * @param requestId 请求标识

    * @param expireTime 超期时间

    * @return 是否获取成功

    */

    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId,int expireTime) {

String result = jedis.set(lockKey, requestId,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME, expireTime);

if (LOCK_SUCCESS.equals(result)) {

return true;

}

return false;

}

}

代码相关说明:

可以看到,我们加锁就一行代码:jedis.set(String key, String value, String nxxx, String expx, int time),这个set()方法一共有五个形参:

第一个为key,我们使用key来当锁,因为key是唯一的。

第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因就是我们在上面讲到可靠性时,分布式锁要满足第四个条件解铃还须系铃人,通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。requestId可以使用UUID.randomUUID().toString()方法生成。

第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作;

第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定。

第五个为time,与第四个参数相呼应,代表key的过期时间。

总的来说,执行上面的set()方法就只会导致两种结果:

1. 当前没有锁(key不存在),那么就进行加锁操作,并对锁设置个有效期,同时value表示加锁的客户端。

2. 已有锁存在,不做任何操作。

你可能感兴趣的:(spring boot 下Redis 实现分布式锁)