zoukankan      html  css  js  c++  java
  • Jedis实现分布式锁

    Jedis pom

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    

    JedisUtil

    import redis.clients.jedis.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class RedisUtil {
       // Redis 服务器 IP
       private String address = "127.0.0.1";
    
       // Redis的端口号
       private int port = 6379;
    
       // 访问密码
       private String password = "123456";
    
       // 连接 redis 等待时间
       private int timeOut = 10000;
    
       // 可用连接实例的最大数目,默认值为8;
       // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
       private int maxTotal = -1;
    
       // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8
       private int maxIdle = 200;
    
       // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
       private int maxWait = 10000;
    
       // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
       private boolean testOnBorrow = true;
    
       // 连接池
       private JedisPool jedisPool = null;
    
       // 构造函数
       public RedisUtil() {
           try {
               JedisPoolConfig config = new JedisPoolConfig();
               config.setMaxTotal(maxTotal);
               config.setMaxIdle(maxIdle);
               config.setMaxWaitMillis(maxWait);
               config.setTestOnBorrow(testOnBorrow);
               jedisPool = new JedisPool(config, address, port, timeOut, password);
           } catch(Exception e) {
               e.printStackTrace();
           }
       }
    
       // 获取 Jedis 实例
       public Jedis getJedis() {
           if (jedisPool != null) {
               return jedisPool.getResource();
           }
           return null;
       }
    
    }
    
    

    Jedis实现分布式锁

    import redis.clients.jedis.Jedis;
    
    import java.util.Collections;
    
    public class RedisTest {
       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) {
    
           String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
    
           if (LOCK_SUCCESS.equals(result)) {
               return true;
           }
           return false;
    
       }
    
    
       public static boolean tryReleaseLock(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));
               if(LOCK_SUCCESS.equals(jedis.del(lockKey)))
                   return true;
           return false;
       }
    
       public static void main(String[] args) {
           System.out.println(tryGetDistributedLock(new RedisUtil().getJedis(),
                   new String("mykey"),new String("hhhh"),50));
       }
    }
    
    

    from ruthless and liuyang0

  • 相关阅读:
    [AX2012 R3]在SSRS报表中使用QR二维码
    [AX2012 R3]关于Alerts
    [AX2012 R3]关于Named user license report
    [AX2012]Report data provider调试
    [AX2012]Claims user
    [AX2012]发送广播邮件
    [AX 2012] Woker user request
    AX2012 R3升级CU8的一些错误
    消失的银行 读后感
    Openstack实践(1)部署使用实例及neutron网络
  • 原文地址:https://www.cnblogs.com/BBchao/p/9377644.html
Copyright © 2011-2022 走看看