当前位置:网站首页>Redis分布式锁的实现

Redis分布式锁的实现

2022-07-04 19:03:00 大丈夫在世当日食一鲲

1导入jedis依赖

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>随便填版本</version>
</dependency>

2 加锁&&解锁

@Component
class RedisTool {
private static final String LOCK_SUCCESS = “OK”;
private static final String SET_IF_NOT_EXIST = “NX”;
private static final String SET_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;

}

/**
 * 释放分布式锁
 * @param jedis Redis客户端
 * @param lockKey 锁
 * @param requestId 请求标识
 * @return 是否释放成功
 */
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {

    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
    Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

    if (RELEASE_SUCCESS.equals(result)) {
        return true;
    }
    return false;

}

}

3 这个比较简单,官方建议使用reddsion建立分布式锁

4 这里存在一些问题 后续再补充,先抛出来,并提供一些方案,如有不足,欢迎开喷

1.此处设置了过期时间,但是如果两个服务先后发起了一个请求,a服务卡住了,锁到期了,B服务启动了,但是B服务开的锁被A服务关了,B服务处于无锁状态,A服务关的不是自己的锁,所以。。。。
对于这种问题 上面用了requestId 来解决
2 假设因业务需要,不需要设定过期时间的情况下,服务挂了,重启 这个锁,锁了寂寞。此处可以利用redis的哨兵模式了
3 假设redis挂了,锁失效,服务接近于裸奔,数据也不知道是不是脏了,针对业务点,适当使用事务回滚进行操作

原网站

版权声明
本文为[大丈夫在世当日食一鲲]所创,转载请带上原文链接,感谢
https://butuputaopi.blog.csdn.net/article/details/116528731