- jedis是java中的一個(gè)redis的客戶端庫(kù)来破,使用maven依賴jedis即可在項(xiàng)目中連接redis
maven項(xiàng)目中使用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服務(wù)器
jedis.set("name","martain"); //添加一個(gè)字符串
String name = jedis.get("name"); // 獲取一個(gè)字符串
System.out.println("name:"+name);
jedis 的使用非常的簡(jiǎn)單,連接服務(wù)器之后忘古,使用實(shí)例化的對(duì)象基本可以執(zhí)行所有的redis操作
redis 的應(yīng)用層協(xié)議-RESP
RESP是基于TCP的應(yīng)用層協(xié)議,他有如下特點(diǎn):
(1)簡(jiǎn)單的實(shí)現(xiàn)
∽缬铡(2)快速地被計(jì)算機(jī)解析
∷杩啊(3)簡(jiǎn)單得可以能被人工解析
(4)網(wǎng)絡(luò)層,Redis在TCP端口6379上監(jiān)聽(tīng)到來(lái)的連接(本質(zhì)就是socket)干旁,客戶端連接到來(lái)時(shí)驶沼,Redis服務(wù)器為此創(chuàng)建一個(gè)TCP連接。在客戶端與服務(wù)器端之間傳輸?shù)拿總€(gè)Redis命令或者數(shù)據(jù)都以\r\n結(jié)尾争群。
測(cè)試RESP協(xié)議
這里通過(guò)啟動(dòng)一個(gè)server socket來(lái)充當(dāng)redis server,然后使用jedis來(lái)連接該服務(wù)器回怜,執(zhí)行set、get方法來(lái)獲取jedis客戶端實(shí)際發(fā)送的數(shù)據(jù)换薄。
自定義服務(wù)器
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); // 啟動(dòng)一個(gè)服務(wù)器 端口為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();
}
}
編寫(xiě)測(cè)試方法
set方法
@Test
public void jeditSet(){
Jedis jedis = new Jedis("127.0.0.1",6398);
jedis.set("name","martain");
jedis.close();
}
// 執(zhí)行set方法后 RedisVM 的控制臺(tái)輸出
*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();
}
// 執(zhí)行g(shù)et方法后 RedisVM 的控制臺(tái)輸出
*2
$3
GET
$4
name
通過(guò)官方說(shuō)明我們可以知道:
數(shù)據(jù)類(lèi)型Arrays 以*號(hào)開(kāi)頭 格式 * + 數(shù)組元素個(gè)數(shù)
大字符串類(lèi)型 以$號(hào)開(kāi)頭 格式為 $ + 字符串長(zhǎng)度\r\n 字符串\r\n
也可以解釋為:
*后面數(shù)量表示存在幾個(gè)$
$后面數(shù)量表示字符串的長(zhǎng)度
所以如果我們能遵守該約定玉雾,我們就能實(shí)現(xiàn)簡(jiǎn)單的redis客戶端
手寫(xiě)redis客戶端
廢話不多說(shuō),直接上源碼
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);
}
}
測(cè)試方法
@Test
public void MyClientTest() throws IOException {
MyClient client = new MyClient();
client.set("name", "java");
String name = client.get("name");
System.out.print(name);
}
測(cè)試輸出
$4
java
怎么樣轻要?是否是非常簡(jiǎn)單复旬?