美文网首页
java中使用jedis以及手写redis客户端

java中使用jedis以及手写redis客户端

作者: Martain | 来源:发表于2020-03-23 19:30 被阅读0次
  • jedis是java中的一个redis的客户端库,使用maven依赖jedis即可在项目中连接redis

maven项目中使用jedis

  • pom文件中添加依赖
 <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
 </dependency>
  • 代码中使用
Jedis jedis = new Jedis("127.0.0.1",6397); //连接redis服务器
jedis.set("name","martain");                        //添加一个字符串
String name = jedis.get("name");               // 获取一个字符串
System.out.println("name:"+name);

jedis 的使用非常的简单,连接服务器之后,使用实例化的对象基本可以执行所有的redis操作

redis 的应用层协议-RESP

RESP是基于TCP的应用层协议,他有如下特点:
(1)简单的实现
  (2)快速地被计算机解析
  (3)简单得可以能被人工解析
  (4)网络层,Redis在TCP端口6379上监听到来的连接(本质就是socket),客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n结尾。

测试RESP协议

这里通过启动一个server socket来充当redis server,然后使用jedis来连接该服务器,执行set、get方法来获取jedis客户端实际发送的数据。

自定义服务器

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author Martin
 * @version 1.0
 * @date 2020/3/23 5:12 下午
 */
public class RedisVM {
    public static void main(String[] args) throws IOException {
        ServerSocket redisVm = new ServerSocket(6398);  // 启动一个服务器 端口为6398
        Socket socket = redisVm.accept();            
        byte[] request = new byte[1024];
        InputStream inputStream = socket.getInputStream();
        inputStream.read(request);
        System.out.println(request.toString()); // 直接将流输出
        socket.close();
        redisVm.close();
    }
}

编写测试方法

set方法

    @Test
    public void jeditSet(){
        Jedis jedis = new Jedis("127.0.0.1",6398);
        jedis.set("name","martain");
        jedis.close();
    }
// 执行set方法后 RedisVM 的控制台输出
*3
$3
SET
$4
name
$7
martain

get方法

    @Test
    public void jeditGet(){
        Jedis jedis = new Jedis("127.0.0.1",6398);
        jedis.get("name");
        jedis.close();
    }
// 执行get方法后 RedisVM 的控制台输出
*2
$3
GET
$4
name

通过官方说明我们可以知道:
数据类型Arrays 以*号开头 格式 * + 数组元素个数
大字符串类型 以$号开头 格式为 $ + 字符串长度\r\n 字符串\r\n
也可以解释为:
*后面数量表示存在几个$
$后面数量表示字符串的长度

所以如果我们能遵守该约定,我们就能实现简单的redis客户端

手写redis客户端

废话不多说,直接上源码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * @author Martin
 * @version 1.0
 * @date 2020/3/23 5:26 下午
 */
public class MyClient {
    Socket socket;
    InputStream reader;
    OutputStream writer;
    public MyClient() throws IOException {
        socket = new Socket("127.0.0.1",6397);
        reader = socket.getInputStream();
        writer = socket.getOutputStream();
    }
    public String set(String key,String value) throws IOException {
        StringBuffer command = new StringBuffer();
        command.append("*3").append("\r\n");
        command.append("$3").append("\r\n");
        command.append("SET").append("\r\n");
        command.append("$").append(key.getBytes().length).append("\r\n");
        command.append(key).append("\r\n");
        command.append("$").append(value.getBytes().length).append("\r\n");
        command.append(value).append("\r\n");
        writer.write(command.toString().getBytes());
        byte[] response = new byte[1024];
        reader.read(response);
        return new String(response);
    }
    public String get(String key) throws IOException {
        StringBuffer command = new StringBuffer();
        command.append("*2").append("\r\n");
        command.append("$3").append("\r\n");
        command.append("GET").append("\r\n");
        command.append("$").append(key.getBytes().length).append("\r\n");
        command.append(key).append("\r\n");
        writer.write(command.toString().getBytes());
        byte[] response = new byte[1024];
        reader.read(response);
        return new String(response);
    }
}

测试方法

    @Test
    public void MyClientTest() throws IOException {
        MyClient client = new MyClient();
        client.set("name", "java");
        String name = client.get("name");
        System.out.print(name);
    }

测试输出

$4
java

怎么样?是否是非常简单?

一、redis 入门(一)

二、redis 入门(二)

三、手写redis客户端

四、redis 读写分离、高可用

相关文章

网友评论

      本文标题:java中使用jedis以及手写redis客户端

      本文链接:https://www.haomeiwen.com/subject/xiqgyhtx.html