1. 程式人生 > >Jedis實現分布式鎖

Jedis實現分布式鎖

分布式鎖 password tdi with htm .get 操作 狀態 cnblogs

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

Jedis實現分布式鎖