IDAE+SpringBoot+redis+Jedis实现分布式锁

①在(idea+SpringBoot+redis整合+RedisUtil可直接使用)笔记搭建成功的基础上
②创建jedis工具类

1.集群redis实现分布式锁(jedisCluster)

package com.example.redis;
import redis.clients.jedis.*;
import java.util.*;
/**
 * JedisPool工具类
 * 加载配置文件,配置连接池的参数
 * 提供获取连接的方法
 */
public class JedisPoolUtils {
    public static JedisCluster jedisCluster;
    static {
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(2);
        config.setMaxIdle(1);
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("10.160.13.114", 6381));
        jedisClusterNode.add(new HostAndPort("10.160.13.114", 6380));
        jedisClusterNode.add(new HostAndPort("10.160.13.114", 6379));
        jedisClusterNode.add(new HostAndPort("10.160.13.114", 6384));
        jedisClusterNode.add(new HostAndPort("10.160.13.114", 6383));
        jedisClusterNode.add(new HostAndPort("10.160.13.114", 6382));
        jedisCluster = new JedisCluster(jedisClusterNode, config);
    }
    /**
     * 加锁操作
     * @param key 锁标识
     * @param uniqueId 客户端标识
     * @param timeOut 过期时间
     */
    public static boolean lock(String key, String uniqueId, Long timeOut) {
        boolean jedisTag = "OK".equals(jedisCluster.set(key, uniqueId, "NX", "EX", timeOut)) ? true : false;
        return jedisTag;
    }
    /**
     * 释放锁
     * @param key 锁标识
     * @param uniqueId 客户端标识
     * @return
     */
    public static boolean unLock(String key, String uniqueId) {
        //lua脚本
        String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else  return 0 end";
        boolean jedisTag = "OK".equals(jedisCluster.eval(luaScript,Collections.singletonList(key), Collections.singletonList(uniqueId)));
        return jedisTag;
    }
    /**
     * 尝试加锁
     * @param key 锁标识
     * @param value 客户端标识
     * @param timeOut 过期时间
     * @param retry 重试次数
     * @param sleepTime 重试间隔时间
     * @return
     */
    public static Boolean lockRetry(String key,String value,Long timeOut,Integer retry,Long sleepTime){
        Boolean flag = false;
        try {
            for (int i=0;i<retry;i++){
                flag = lock(key,value,timeOut);
                if(flag){
                    break;
                }
                Thread.sleep(sleepTime);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return flag;
    }
}

注意集群有密码时会抛出:
IDAE+SpringBoot+redis+Jedis实现分布式锁_第1张图片
但是jedis又支持设置密码,解决方法如下
http://www.mamicode.com/info-detail-1451210.html

2.单机版redis实现分布式锁(jedisPool)

package com.example.redis;
import redis.clients.jedis.*;
import java.util.*;

/**
 * JedisPool工具类
 * 加载配置文件,配置连接池的参数
 * 提供获取连接的方法
 */
public class JedisPoolUtils {
    public static JedisPool jedisPool;

    static {
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(2);
        config.setMaxIdle(1);
        jedisPool = new JedisPool(config, "10.160.13.114", 6381, 2000, "SSJ5IdEL");
    }
    /**
     * 加锁操作
     * @param key 锁标识
     * @param uniqueId 客户端标识
     * @param timeOut 过期时间
     */
    public static boolean lock(String key, String uniqueId, Long timeOut) {
        Jedis jedis =jedisPool.getResource();
        boolean jedisTag = "OK".equals(jedis.set(key, uniqueId, "NX", "EX", timeOut)) ? true : false;
        jedis.close();
        return jedisTag;
    }

    /**
     * 释放锁
     * @param key 锁标识
     * @param uniqueId 客户端标识
     * @return
     */
    public static boolean unLock(String key, String uniqueId) {
        //lua脚本
        String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else  return 0 end";
        Jedis jedis =jedisPool.getResource();
        boolean jedisTag = "OK".equals(jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(uniqueId)));
        jedis.close();
        return jedisTag;
    }
    /**
     * 尝试加锁
     * @param key 锁标识
     * @param value 客户端标识
     * @param timeOut 过期时间
     * @param retry 重试次数
     * @param sleepTime 重试间隔时间
     * @return
     */
    public static Boolean lockRetry(String key,String value,Long timeOut,Integer retry,Long sleepTime){
        Boolean flag = false;
        try {
            for (int i=0;i<retry;i++){
                flag = lock(key,value,timeOut);
                if(flag){
                    break;
                }
                Thread.sleep(sleepTime);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return flag;

    }
}

另一种单机版redis分布式锁(https://www.cnblogs.com/liuyang0/p/6744076.html)

你可能感兴趣的:(分布式锁,Redis)