本文次要钻研一下RedisToken

RedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/RedisToken.java

public interface RedisToken {  RedisToken NULL_STRING = string((SafeString) null);  RedisToken RESPONSE_OK = status("OK");  RedisTokenType getType();  <T> T accept(RedisTokenVisitor<T> visitor);  static RedisToken nullString() {    return NULL_STRING;  }  static RedisToken responseOk() {    return RESPONSE_OK;  }  static RedisToken string(SafeString str) {    return new StringRedisToken(str);  }  static RedisToken string(String str) {    return new StringRedisToken(safeString(str));  }  static RedisToken status(String str) {    return new StatusRedisToken(str);  }  static RedisToken integer(boolean b) {    return new IntegerRedisToken(b ? 1 : 0);  }  static RedisToken integer(int i) {    return new IntegerRedisToken(i);  }  static RedisToken error(String str) {    return new ErrorRedisToken(str);  }  static RedisToken array(RedisToken... redisTokens) {    return new ArrayRedisToken(ImmutableList.of(redisTokens));  }  static RedisToken array(Collection<RedisToken> redisTokens) {    return new ArrayRedisToken(ImmutableList.from(redisTokens));  }  static RedisToken array(Sequence<RedisToken> redisTokens) {    return new ArrayRedisToken(redisTokens.asArray());  }  static <T> Stream<T> visit(Stream<RedisToken> tokens, RedisTokenVisitor<T> visitor) {    return tokens.map(token -> token.accept(visitor));  }}
  • RedisToken接口定义了getType、accept办法;它还提供了nullString、responseOk、string、status、integer、error、array、visit静态方法

AbstractRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

public abstract class AbstractRedisToken<T> implements RedisToken {  private static final String SEPARATOR = "=>";  private static final Equal<AbstractRedisToken<?>> EQUAL =      Equal.<AbstractRedisToken<?>>of()          .comparing(AbstractRedisToken::getType)          .comparing(AbstractRedisToken::getValue);  private final RedisTokenType type;  private final T value;  private AbstractRedisToken(RedisTokenType type, T value) {    this.type = requireNonNull(type);    this.value = value;  }  @Override  public RedisTokenType getType() {    return type;  }  public T getValue() {    return value;  }  @Override  public int hashCode() {    return Objects.hash(type, value);  }  @Override  public boolean equals(Object obj) {    return EQUAL.applyTo(this, obj);  }  @Override  public String toString() {    return type + SEPARATOR + value;  }}
  • AbstractRedisToken申明实现RedisToken接口,它的结构器要求输出type、value

UnknownRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

  public static final class UnknownRedisToken extends AbstractRedisToken<SafeString> {    UnknownRedisToken(SafeString value) {      super(RedisTokenType.UNKNOWN, value);    }    @Override    public <T> T accept(RedisTokenVisitor<T> visitor) {      return visitor.unknown(this);    }  }
  • UnknownRedisToken继承了AbstractRedisToken,其value为SafeString类型,其type为RedisTokenType.UNKNOWN,其accept执行的是visitor.unknown(this)

StringRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

  public static final class StringRedisToken extends AbstractRedisToken<SafeString> {    StringRedisToken(SafeString value) {      super(RedisTokenType.STRING, value);    }    @Override    public <T> T accept(RedisTokenVisitor<T> visitor) {      return visitor.string(this);    }  }
  • StringRedisToken继承了AbstractRedisToken,其value为SafeString,其type为RedisTokenType.STRING,其accept执行的是visitor.string(this)

StatusRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

  public static final class StatusRedisToken extends AbstractRedisToken<String> {    StatusRedisToken(String value) {      super(RedisTokenType.STATUS, value);    }    @Override    public <T> T accept(RedisTokenVisitor<T> visitor) {      return visitor.status(this);    }  }
  • StatusRedisToken继承了AbstractRedisToken,其value为String,其type为RedisTokenType.STATUS,其accept执行的是visitor.status(this)

ErrorRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

  public static final class ErrorRedisToken extends AbstractRedisToken<String> {    ErrorRedisToken(String value) {      super(RedisTokenType.ERROR, value);    }    @Override    public <T> T accept(RedisTokenVisitor<T> visitor) {      return visitor.error(this);    }  }
  • ErrorRedisToken继承了AbstractRedisToken,其value为String,其type为RedisTokenType.ERROR,其accept执行的是visitor.error(this)

IntegerRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

  public static final class IntegerRedisToken extends AbstractRedisToken<Integer> {    IntegerRedisToken(Integer value) {      super(RedisTokenType.INTEGER, value);    }    @Override    public <T> T accept(RedisTokenVisitor<T> visitor) {      return visitor.integer(this);    }  }
  • IntegerRedisToken继承了AbstractRedisToken,其value为Integer,其type为RedisTokenType.INTEGER,其accept执行的是visitor.integer(this)

ArrayRedisToken

resp-server-0.16.0/src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java

  public static final class ArrayRedisToken extends AbstractRedisToken<Sequence<RedisToken>> {    ArrayRedisToken(Sequence<RedisToken> value) {      super(RedisTokenType.ARRAY, requireNonNull(value).asArray());    }    @Override    public <T> T accept(RedisTokenVisitor<T> visitor) {      return visitor.array(this);    }    public int size() {      return getValue().size();    }  }
  • ArrayRedisToken继承了AbstractRedisToken,其value为Sequence<RedisToken>,其type为RedisTokenType.ARRAY,其accept执行的是visitor.array(this)

小结

RedisToken接口定义了getType、accept办法;它还提供了nullString、responseOk、string、status、integer、error、array、visit静态方法;AbstractRedisToken申明实现RedisToken接口,它的结构器要求输出type、value,它有UnknownRedisToken、StringRedisToken、StatusRedisToken、ErrorRedisToken、IntegerRedisToken、ArrayRedisToken这些实现类

doc

  • RedisToken