美文网首页
Redis实现分布式锁

Redis实现分布式锁

作者: HachiLin | 来源:发表于2020-12-16 16:01 被阅读0次

1. 分布式锁分类

    1. 数据库乐观锁
    1. 基于Redis的分布式锁
    1. 基于ZooKeeper的分布式锁

2. 组件依赖

pom.xml文件加入jedis开源组件:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

3. 使用

  • 加锁方法
import redis.clients.jedis.JedisCluster;

@Resource
private JedisCluster jedisCluster;

final static int LOCK_TIMEOUT = 100;
/**
* 获得锁的方法
*/
public boolean tryLock(String key, String reqId) {
    if (jedisCluster == null) {
        logger.error("jedis cluster is null");
        return false;
    }
    try {
        int index = 0;
        while (index < MAX_COUNT) {
            String redisRet = jedisCluster.set(key, System.currentTimeMillis() + "", "NX", "EX", LOCK_TIMEOUT);
            if ("OK" == redisRet) {
                return true;
            }
            index++;
            Thread.sleep(100);
        }
        // 超过最多重试获锁次数,返回失败
        return false;
    }catch(Exception e) {
        logger.error(..);
        return false;
    }
}

加锁方法中的set函数里的参数解释可以参考我在下面放的参考文献。【mark】

  • 释放锁方法
/**
* 释放锁
*/
public void realseLock(String key) {
    try {
        Long ret = jedisCluster.del(key);
        if (ret != 1L) {
            logger.warn("删除key失败,可能需要手工处理");
        }
    } catch(Exception e) {
        logger.error(...);   
    }
}

这里的释放锁方法使用del()可能会有问题,公司目前使用的是该方法,可以参考我在下面放的参考文献。

  • 整合使用
public T method() {
    String lockKey = "XXX";  // 使用特点规则生成唯一的key
    try {
        boolean getLock = redisLockHandler.tryLock(lockKey, String reqId);
        if (getLock) {
            ...
            业务流程
            ...
        }
    } catch (Exception e) {
        logger.error(...);
    } finally {
        redisLockHandler.realseLock(lockKey);
    }
}

3. 参考文献

相关文章

网友评论

      本文标题:Redis实现分布式锁

      本文链接:https://www.haomeiwen.com/subject/shnngktx.html