您好,登錄后才能下訂單哦!
本篇內容主要講解“RespCommand的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“RespCommand的使用方法”吧!
本文主要研究一下RespCommand
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/RespCommand.java
@FunctionalInterface public interface RespCommand { RedisToken execute(Request request); }
RespCommand定義了execute方法,接收Request參數,返回RedisToken
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/Request.java
public interface Request { String getCommand(); ImmutableArray<SafeString> getParams(); SafeString getParam(int i); Option<SafeString> getOptionalParam(int i); int getLength(); boolean isEmpty(); Session getSession(); ServerContext getServerContext(); boolean isExit(); }
Request接口定義了getCommand、getParams、getParam、getOptionalParam、getLength、isEmpty、getSession、getServerContext、isExit方法
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/DefaultRequest.java
public class DefaultRequest implements Request { private final SafeString command; private final ImmutableArray<SafeString> params; private final Session session; private final ServerContext server; public DefaultRequest(ServerContext server, Session session, SafeString command, ImmutableArray<SafeString> params) { this.server = server; this.session = session; this.command = requireNonNull(command); this.params = requireNonNull(params); } @Override public String getCommand() { return command.toString(); } @Override public ImmutableArray<SafeString> getParams() { return params; } @Override public SafeString getParam(int i) { if (i < params.size()) { return params.get(i); } return null; } @Override public Option<SafeString> getOptionalParam(int i) { return Option.of(() -> getParam(i)); } @Override public int getLength() { return params.size(); } @Override public boolean isEmpty() { return params.isEmpty(); } @Override public boolean isExit() { return command.toString().equalsIgnoreCase("quit"); } @Override public Session getSession() { return session; } @Override public ServerContext getServerContext() { return server; } @Override public String toString() { return command + "[" + params.size() + "]: " + params; } }
DefaultRequest實現了Request接口,它定義了command、params、session、server屬性,均在構造器中傳入
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/CommandSuite.java
public class CommandSuite { private static final Logger LOGGER = LoggerFactory.getLogger(CommandSuite.class); private final Map<String, Class<?>> metadata = new HashMap<>(); private final Map<String, RespCommand> commands = new HashMap<>(); private final NullCommand nullCommand = new NullCommand(); private final CommandWrapperFactory factory; public CommandSuite() { this(new DefaultCommandWrapperFactory()); } public CommandSuite(CommandWrapperFactory factory) { this.factory = factory; addCommand(PingCommand.class); addCommand(EchoCommand.class); addCommand(QuitCommand.class); addCommand(TimeCommand.class); } public RespCommand getCommand(String name) { return commands.getOrDefault(name.toLowerCase(), nullCommand); } public boolean isPresent(String name, Class<? extends Annotation> annotationClass) { return getMetadata(name).isAnnotationPresent(annotationClass); } public boolean contains(String name) { return commands.get(name) != null; } protected void addCommand(Class<?> clazz) { Try.of(clazz::newInstance) .onSuccess(this::processCommand) .onFailure(e -> LOGGER.error("error loading command: " + clazz.getName(), e)); } protected void addCommand(String name, RespCommand command) { commands.put(name.toLowerCase(), factory.wrap(command)); } private void processCommand(Object command) { Class<?> clazz = command.getClass(); Command annotation = clazz.getAnnotation(Command.class); if (annotation != null) { commands.put(annotation.value(), factory.wrap(command)); metadata.put(annotation.value(), clazz); } else { LOGGER.warn("annotation not present at {}", clazz.getName()); } } private Class<?> getMetadata(String name) { return metadata.getOrDefault(name.toLowerCase(), Void.class); } }
CommandSuite的構造器添加了PingCommand、EchoCommand、QuitCommand、TimeCommand四個command;addCommand方法將factory.wrap(command)的命令放入commands中
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/CommandWrapperFactory.java
public interface CommandWrapperFactory { RespCommand wrap(Object command); }
CommandWrapperFactory定義了wrap方法,將command包裝為RespCommand
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/DefaultCommandWrapperFactory.java
public class DefaultCommandWrapperFactory implements CommandWrapperFactory { @Override public RespCommand wrap(Object command) { if (command instanceof RespCommand) { return new CommandWrapper((RespCommand) command); } throw new IllegalArgumentException("must implements command interface"); } }
DefaultCommandWrapperFactory實現了CommandWrapperFactory接口,其wrap方法使用CommandWrapper包裝RespCommand
resp-server-0.16.0/src/main/java/com/github/tonivade/resp/command/CommandWrapper.java
public class CommandWrapper implements RespCommand { private int params; private final RespCommand command; public CommandWrapper(RespCommand command) { this.command = command; ParamLength length = command.getClass().getAnnotation(ParamLength.class); if (length != null) { this.params = length.value(); } } @Override public RedisToken execute(Request request) { if (request.getLength() < params) { return error("ERR wrong number of arguments for '" + request.getCommand() + "' command"); } return command.execute(request); } }
CommandWrapper會讀取ParamLength注解,若讀的到則將注解的value值賦值給params,用于execute方法對request的參數長度進行校驗
RespCommand定義了execute方法,接收Request參數,返回RedisToken;CommandSuite的構造器添加了PingCommand、EchoCommand、QuitCommand、TimeCommand四個command;addCommand方法將factory.wrap(command)的命令放入commands中;DefaultCommandWrapperFactory實現了CommandWrapperFactory接口,其wrap方法使用CommandWrapper包裝RespCommand;CommandWrapper會讀取ParamLength注解,若讀的到則將注解的value值賦值給params,用于execute方法對request的參數長度進行校驗
到此,相信大家對“RespCommand的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。