zoukankan      html  css  js  c++  java
  • 封装jedis自己实现锁

    package me.ele.marketing.budget.processor.lock;

    import lombok.Getter;
    import me.ele.napos.vine.misc.exception.UnexpectedStateException;
    import me.ele.napos.vine.util.lock.Lock;
    import me.ele.napos.vine.util.lock.LockFailedException;
    import me.ele.napos.vine.util.lock.LockHandle;
    import me.ele.napos.vine.util.lock.internal.LockHandleImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import redis.clients.jedis.Jedis;

    import java.awt.image.Kernel;
    import java.io.Closeable;
    import java.time.LocalDateTime;
    import java.util.concurrent.ThreadLocalRandom;

    /**

    • @author: 谢洪伟

    • 2021/7/1 5:03 下午
      */
      @Service
      public class MyRedisLock implements Lock {
      @Autowired
      private Jedis jedis;
      private ThreadLocalRandom random = ThreadLocalRandom.current();

      @Override
      public LockHandle lock(String key) throws LockFailedException {
      return null;
      }

      @Override
      public LockHandle lock(String key, int expireMills) throws LockFailedException {
      return null;
      }

      @Override
      public LockHandle lock(String key, int expireMills, int waitMills) throws LockFailedException {
      LockHandle handle = new LockHandleImpl(this, key);
      if (waitMills > 0) {
      LocalDateTime ttl = LocalDateTime.now().plusNanos(waitMills);
      do {
      String locked = jedis.set(key, handle.getToken(), "nx", "px", waitMills);
      if (locked != null) {
      return handle;
      }
      try {
      Thread.sleep(random.nextInt(10,100));
      } catch (InterruptedException e) {
      throw new UnexpectedStateException(e);
      }
      } while (LocalDateTime.now().isAfter(ttl));
      throw new RuntimeException("上锁超时");
      }else{
      String locked = jedis.set(key, handle.getToken(), "nx", "px", waitMills);
      if ( locked != null){
      return handle;
      }
      throw new RuntimeException("上锁失败");
      }
      }

      @Override
      public void unlock(LockHandle handle) {
      String token = jedis.get(handle.getKey());
      if (token.equals(handle.getToken())) {
      jedis.del(handle.getKey());
      }
      }

      public interface Handler extends Closeable {
      String getKey();

       /**
        * Lock token.
        */
       String getToken();
      
       /**
        * Release the lock.
        */
       void unlock();
      
       /**
        * The IOExceptional-off close method.
        */
       @Override
       default void close() {
           unlock();
       }
      

      }
      @Getter
      public class HandlerImpl implements Handler {
      private Lock lock;
      private String key;
      private String token;

       public HandlerImpl(Lock lock, String key) {
           this.lock = lock;
           this.key = key;
       }
      
       @Override
       public String getKey() {
           return this.key;
       }
      
       @Override
       public String getToken() {
           return null;
       }
      
       @Override
       public void unlock() {
           lock.unlock(this);
       }
      

      }

    }

  • 相关阅读:
    lua 根据路径获取文件名
    python中的re模块
    正则表达式中的开头和结尾
    正则表达式匹配多个字符
    正则表达式中匹配单个字符
    正则表达式的作用
    gevent实现协程
    greenlet实现协程
    生成器的使用注意
    生成器实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/albertXe/p/14959918.html
Copyright © 2011-2022 走看看