redis分布式锁

middleware0 2020-04-30

redis分布式锁。

redis单线程理解:

redis操作基于命令,在一个命令执行过程中,其他命令处于等待排队状态。不可能同时执行两个命令。

故redis很适合锁分布式锁

代码:

private static String lockKey = "myLockKey";

    /**
     * value:当前时间ms值 + 超时时间(如3s)
     * @param jedis
     * @param value
     * @return
     */
    public boolean lock(Jedis jedis, String value){
        Long result = jedis.setnx(lockKey, value);
        //添加成功
        if(result == 1){
            return true;
        }
        String oldValue = jedis.get(lockKey);
        //锁过期
        if(!StringUtils.isEmpty(oldValue) && Long.parseLong(oldValue) < System.currentTimeMillis()){

            String val = jedis.getSet(lockKey, value);
            //因为redis是单线程的,这些判断很有必要
            if(!StringUtils.isEmpty(val) && val.equals(value)){
                return true;
            }
        }
        return false;


    }

    /**
     *
     * @param jedis
     * @param value:与获取锁的value一致
     */
    public void unLock(Jedis jedis, String value){
        try{
            String old = jedis.get(lockKey);
            if(!StringUtils.isEmpty(old) && old.equals(value)){
                jedis.del(lockKey);
            }
        }catch (Exception e){
            e.printStackTrace();
        }


    }

setnx:若存在,则不添加,返回0

  若不存在,添加成功,返回1

相关推荐

DiamondTao / 0评论 2020-08-30