- 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
怎么样?是否是非常简单?
网友评论