美文网首页
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