redis获取锁和释放锁

import redis.clients.jedis.Jedis;
import java.util.Collections;

/**
 * redis 工具类
 */
public class RedisUtils {

    /**
     * 加锁成功返回的数据
     */
    private static final String LOCK_SUCCESS = "OK";

    /**
     * 如果key不存在则进行添加
     */
    private static final String SET_ID_NOT_EXIST = "NX";

    /**
     * 设置过期时间
     */
    private static final String SET_WITH_EXPIRE_TIME = "PX";

    /**
     * 释放锁成功的返回值
     */
    private static final Long RELEASE_SUCCESS = 1L;

    /**
     * 获取redis锁,使用原子方法获取并返回结果
     *
     * @param jedis jedis实例
     * @param lockKey redis key
     * @param requestId redis值,这里设置为请求id,为了实现加锁者才能解锁
     * @param expireTime 过期时间
     * @return 获取锁结果,true获取成功,false失败
     */
    public boolean getLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
        // 此处为原子操作
        String result = jedis.set(lockKey, requestId, SET_ID_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        return LOCK_SUCCESS.equals(result);
    }

    /**
     * 释放redis锁,使用执行命令的方式原子操作释放锁,并保证释放者就是加锁者
     *
     * @param jedis jedis实例
     * @param lockKey redis key
     * @param requestId redis值,这里设置为请求id,为了实现加锁者才能解锁
     * @return 释放锁结果,true获取成功,false失败
     */
    public static boolean releaseLock(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));
        return RELEASE_SUCCESS.equals(result);
    }

}

你可能感兴趣的:(redis获取锁和释放锁)