基于redis的setnx的分布式锁

  1. public class SoaLockSupport {  
  2.   
  3.     private Logger logger = Logger.getLogger(SoaLockSupport.class);  
  4.           
  5.         //你的redis实现类  
  6.     private RedisAAA redis;  
  7.   
  8.     // 超时时间  
  9.     private long timeout = 3000;  
  10.       
  11.     /** 
  12.      * 获得锁,如果没拿到,会在超时时间内一直等待 
  13.      */  
  14.     public boolean lock(final String key) {  
  15.         FutureTask<Boolean> future = new FutureTask<Boolean>(new Callable<Boolean>() {  
  16.             public Boolean call() {  
  17.                 boolean nx = false;  
  18.                 for (;;) {  
  19.                     nx = setnx(key);  
  20.                     if(nx){  
  21.                         break;  
  22.                     }  
  23.                     try {  
  24.                         // 获取不到暂停2ms  
  25.                         Thread.sleep(2);  
  26.                     } catch (InterruptedException e) {  
  27.                         //  
  28.                     }  
  29.                 }  
  30.                 return nx;  
  31.             }  
  32.         });  
  33.         try {  
  34.             return future.get(timeout, TimeUnit.MILLISECONDS);  
  35.         } catch (Exception e) {  
  36.             logger.error("try lock error,key = "+key, e);  
  37.         }  
  38.           
  39.         return false;  
  40.     }  
  41.   
  42.     /** 
  43.      * 尝试获得锁,如果没拿到,直接返回失败 
  44.      */  
  45.     public boolean trylock(String key) {  
  46.         if (setnx(key)) {  
  47.             return true;  
  48.         }  
  49.   
  50.         // 做这一步是防止key一直不被Delete,导致锁一直得不到释放的问题  
  51.         String oldTime = redis.getString(key);  
  52.         if (oldTime != null && !oldTime.equals("")) {  
  53.             long time = Long.valueOf(oldTime) + timeout;  
  54.             long now  = System.currentTimeMillis();  
  55.               
  56.             if (time < now) {  
  57.                 logger.info("time = "+time + ",and now="+now);  
  58.                 redis.delete(key);  
  59.                 return setnx(key);  
  60.             }  
  61.         }  
  62.         return false;  
  63.     }  
  64.   
  65.     /** 
  66.      * 释放锁 
  67.      */  
  68.     public void unlock(String key) {  
  69.         redis.delete(key);  
  70.     }  
  71.   
  72.     private boolean setnx(String key) {  
  73.         if (redis.setnx(key, System.currentTimeMillis() + "") == 1) {  
  74.             return true;  
  75.         }  
  76.         return false;  
  77.     }  

猜你喜欢

转载自blog.csdn.net/a5575vhj/article/details/88632796