今天学习了如何实现redis客户端,代码如下:
//基于socket的自定义redis客户端
public class Main { static Socket s; static PrintWriter writer; //可以整行读取 static BufferedReader reader; public static void main(String[] args) throws IOException { try { //1.建立连接 String host = "写入自己redis的IP"; int port = 6379; s = new Socket(host,port); //2.获取 输出流,输入流 writer = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), StandardCharsets.UTF_8)); reader = new BufferedReader(new InputStreamReader(s.getInputStream(),StandardCharsets.UTF_8)); //3.发出请求set name AK //3.1.获取授权 auth sendRequest("auth","写入自己redis设置的密码"); Object obj = handleResponse(); System.out.println("obj = " + obj); //3.2.set name AK sendRequest("get","name"); //4.解析响应 obj = handleResponse(); System.out.println("obj = " + obj); } catch (IOException e) { e.printStackTrace(); }finally { //5.释放连接 if(reader != null) reader.close(); if(writer != null) writer.close(); if(s != null) s.close(); } } private static Object handleResponse() throws IOException { //读取首字节,判断数据类型标示 int prefix = reader.read(); //判断数据类型 switch (prefix){ case '+': return reader.readLine(); //单行字符串,直接读一行 case '-': throw new RuntimeException(reader.readLine()); //异常,也读一行 case ':': //数字 return Long.parseLong(reader.readLine()); case '$': //多行字符串 //先读长度 int len = Integer.parseInt(reader.readLine()); if(len == -1){ return null; } if(len == 0){ return ""; } //再读字节,读len个字节,假设没有特殊字符,所以读一行(简化) return reader.readLine(); case '*': return readBulkString(); default: throw new RuntimeException("未知的数据格式!"); } } private static Object readBulkString() throws IOException { //先获取数组大小 int len = Integer.parseInt(reader.readLine()); if(len <= 0){ return null; } //定义集合,接收多个元素 List<Object> list = new ArrayList<>(len); //遍历,依次读取每个元素 for (int i = 0; i < len; i++) { list.add(handleResponse()); } return list; } private static void sendRequest(String ... args) { writer.println("*" + args.length); //代表数组,有三个元素 for (String arg : args) { writer.println("$" + arg.getBytes(StandardCharsets.UTF_8).length); //代表当前字符串为3个字节 writer.println(arg); // } writer.flush(); } }
通过以上代码可以向redis发送命令。
欢迎大家一起来学习,有不足的地方还请指出。