当前位置:网站首页>redis distributed lock code example

redis distributed lock code example

2022-08-10 00:56:00 shy_snow

import java.util.Collections;

import redis.clients.jedis.Jedis;

public class RedisTool
{
    
    
    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";
    
    /** * 尝试获取分布式锁 * * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @param expireTime 超期时间 * @return 是否获取成功 */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime)
    {
    
        /* * set(String key, String value, String nxxx, String expx, int time) * 第一个为key,我们使用key来当锁,因为key是唯一的. * 第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因就是我们在上面讲到可靠性时,分布式锁要满足第四个条件解铃还须系铃人, * 通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据.requestId可以使用UUID.randomUUID().toString()方法生成. * 第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作; * 第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定. 第五个为time,与第四个参数相呼应,代表key的过期时间,单位为ms. * 总的来说,执行set()方法就只会导致两种结果: 1. 当前没有锁(key不存在),那么就进行加锁操作,并对锁设置个有效期,同时value表示加锁的客户端. 2. 已有锁存在,不做任何操作. */
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        
        if (LOCK_SUCCESS.equals(result))
        {
    
            return true;
        }
        return false;
        
    }
    
    
    private static final Long RELEASE_SUCCESS = 1L;
    /** * 释放分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @return 是否释放成功 */
    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
    
        // 使用lua脚本保证原子性
        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 true;
        }
        return false;
    }
    
    public static void main(String[] args) {
    
        String host = "192.168.129.124";
        int port = 6379;
        Jedis jedis = new Jedis(host,port);
        String lockKey = "lockKey";
        boolean ret = tryGetDistributedLock(jedis, lockKey, "requestId", 5000);
        System.out.println(ret+", "+jedis.get(lockKey));
        ret = releaseDistributedLock(jedis, lockKey, "requestId2");
        ret = tryGetDistributedLock(jedis, lockKey, "requestId2", 5000);
        System.out.println(ret+", "+jedis.get(lockKey));
        ret = releaseDistributedLock(jedis, lockKey, "requestId");
        System.out.println(ret+", "+jedis.get(lockKey));
        ret = tryGetDistributedLock(jedis, lockKey, "requestId2", 5000);
        System.out.println(ret+", "+jedis.get(lockKey));
        
    }
}

https://www.w3cschool.cn/redis/redis-yj3f2p0c.html

原网站

版权声明
本文为[shy_snow]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/222/202208092243005422.html