使用redis分布式锁(主要使用了redis中的setnx和getset方法,这两个方法在redisTemplate分别是setIfAbsent和getAndSet方法)实现线程安全,因为redis是单线程,能保证线程的安全性,而且redis强大的读写能力能提高效率。


setnx 如果key已经存在,不做任何操作,返回false ,如果不存在,则set进去,返回true



代码如下:


public static boolean lock(String lock, long time) {
    //进入锁的时间
    long start = System.currentTimeMillis();
    try {
       while (true) {
          //判断等待时间是否已超时
          if (System.currentTimeMillis() - start > WAIT_TIME_LOCK) {
              return false;
          }
          //加锁操作
          if (StringUtils.isNotBlank(lock)) {
              Boolean absent = redisTemplate.opsForValue().setIfAbsent(lock, lock, time, TimeUnit.SECONDS);
             //加锁成功,返回
              if (absent) {
                 return true;
              }
          }
          return false;
       }
    } catch (Exception e) {
       return false;
    }
}
public static void unLock(String lock) {
    try {
       Object o = redisTemplate.opsForValue().get(lock);
       if (o != null && StringUtils.equals(o.toString(), lock)) {
          redisTemplate.delete(lock);
       }
    } catch (Exception e) {
       e.printStackTrace();
    }
}