美文网首页
redis获取锁和释放锁

redis获取锁和释放锁

作者: 漩涡丶路飞 | 来源:发表于2019-04-07 23:52 被阅读0次
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获取锁和释放锁

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