jedis分布式锁实现

jedis分布式锁实现(工具类)

 //分布式锁相关字段
    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";
    private static final Long RELEASE_SUCCESS = 1L;

 /**
     * 尝试获取分布式锁
     * @param lockKey 锁
     * @param requestId 请求标识
     * @param expireTime 超期时间
     * @return 是否获取成功
     */
    public Boolean tryGetDistributedLock(String lockKey, String requestId, Integer expireTime) {
        Jedis jedis = getJedis();
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        if (LOCK_SUCCESS.equals(result)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    /**
     * 释放分布式锁
     * @param lockKey 锁
     * @param requestId 请求标识
     * @return 是否释放成功
     */
    public Boolean releaseDistributedLock(String lockKey, String requestId) {
        Jedis jedis = getJedis();
        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 Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

实现层代码

   String lockKey = "anagroupbuy:" + anaGroupBuyInfo.getId().toString();
            String requestId = UUID.randomUUID().toString();

            Integer i = 0;
            Boolean resultLock;
            do{
                i++;
                //加锁
                resultLock = jedisUtil.tryGetDistributedLock(lockKey, requestId, 1000);
                if(resultLock == true){
                    R result = createGroupBuyUntoPayOneOrder(commodityList,  Long.parseLong(anaOrderId), anaGroupBuyInfo.getId().toString(), map, untoPayOrderDTO, Uid);
                    anaGroupBuyInfoService.updateGroupAmounts(anaGroupBuyInfo.getId());
                    //解锁
                    jedisUtil.releaseDistributedLock(lockKey, requestId);
                    if(result.getCode() != 0){
                        return result;
                    }else{
                        break;
                    }
                }else{
                    sleep(10);
                }
            }while (i<20);

版权声明:本文为weixin_46553523原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。