Redis 如何实现redis分布式锁

1、redis设置key时上锁

参考怎样实现redis分布式锁?

package com.test;

import com.utils.JedisUtil;
import redis.clients.jedis.Jedis;

import java.util.*;

public class Test09_Redis {
    private static final Long SUCCESS = 1L;
    private static Jedis jedis = new Jedis("127.0.0.1");

    public static void main(String[] args) {
        // Jedis jedis = JedisUtil.getJedis();
        // JedisUtil.close(jedis);
        boolean b = tryLock("1", "123");
        boolean b1 = unLock("1", "123");
        System.out.println("b= " + b + " b1= " + b1);
    }

    // public boolean tryLock2(String key, String requestId, int expireTime) {
    //     //使用jedis的api,保证原子性
    //     //NX 不存在则操作 EX 设置有效期,单位是秒
    //     // String result = jedis.set(key, requestId, "NX", "EX", expireTime);
    //     String result = jedis.set(key, requestId, expireTime);
    //     //返回OK则表示加锁成功
    //     return "OK".equals(result);
    // }

    /**
     * 加锁
     */
    public static boolean tryLock(String key, String requestId) {
        //使用setnx命令。
        //不存在则保存返回1,加锁成功。如果已经存在则返回0,加锁失败。
        return SUCCESS.equals(JedisUtil.getJedis().setnx(key, requestId));
    }

    //删除key的lua脚本,先比较requestId是否相等,相等则删除
    private static final String DEL_SCRIPT = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end";

    /**
     * 解锁
     */
    public static boolean unLock(String key, String requestId) {
        //删除成功表示解锁成功
        Long result = (Long) jedis.eval(DEL_SCRIPT, Collections.singletonList(key),
                Collections.singletonList(requestId));
        return SUCCESS.equals(result);
    }
}

Redis 如何实现redis分布式锁

上一篇:Jetpack compose初尝试


下一篇:第10章 内部类