redis.clients
jedis
2.9.0
jar
compile
如何使用呢? 只需要在java中:
Jedis jedis = new Jedis("localhost");//或者Jedis("localhost",6379);
jedis.set("foo", "bar");
String value = jedis.get("foo");
使用就是这么简单!
但是底层又是怎么实现的呢?
这要从get,set方法说起:通过查看源码,同时参考官网,我们发现有一个协议:RESP协议(REdis Serialization Protocol),同时使用socket进行通信的.package com.springboot.demo;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
*
* Redis模拟器
* 内部就是使用socket实现的,这里会模拟一下socket发送命令
* Redis底层是基于RESP (REdis Serialization Protocol)
* Simple to implement.
* Fast to parse.
* Human readable.
* Redis的持久化有两种:aof和快照
* @author xiaopanzi
* @date 2018-03-07
*/
public class RedisTest {
private Socket socket;
public RedisTest () {
try {
socket = new Socket("localhost", 6379); //这里是本地测试,默认端口
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* 模拟一个set方法
* 设置一个key和值
* *3表示有数组3个
* 第一组数组:$3 (字符形,SET长度为3),SET命令
* 第二组数组:$ + key的长度,key
* 第三组数组:$ + value的长度,value
* @param key
* @param value
* @return set成功后返回的数据
*
*/
public String set(final String key,String value){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("*3").append("\r\n");
stringBuilder.append("$3").append("\r\n");
stringBuilder.append("SET").append("\r\n");
stringBuilder.append("$").append(key.length()).append("\r\n");
stringBuilder.append(key).append("\r\n");
stringBuilder.append("$").append(value.length()).append("\r\n");
stringBuilder.append(value).append("\r\n");
byte[] bs = new byte[1024];
try {
//把命令发送出去
socket.getOutputStream().write(stringBuilder.toString().getBytes());
//接收返回内容读到bs中,实际上,成功会返回 "+OK\r\n"
socket.getInputStream().read(bs);
} catch (IOException e) {
e.printStackTrace();
}
return new String(bs);
}
/**
*
* 模拟一个get方法
* 查询一个key
* *2表示有数组2个
* 第一组数组:$3 (字符形,GET长度为3),GET命令
* 第二组数组:$ + key的长度,key
* @param key
* @return get成功后返回的数据
*
*/
public String get(final String key){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("*2").append("\r\n");
stringBuilder.append("$3").append("\r\n");
stringBuilder.append("GET").append("\r\n");
stringBuilder.append("$").append(key.length()).append("\r\n");
stringBuilder.append(key).append("\r\n");
byte[] bs = new byte[1024];
try {
socket.getOutputStream().write(stringBuilder.toString().getBytes());
socket.getInputStream().read(bs);
} catch (IOException e) {
e.printStackTrace();
}
return new String(bs);
}
public static void main(String[] args) {
//构造一个实例,也可写成 new RedisTest("localhost",6397)形式
RedisTest redisTest = new RedisTest();
//使用set方法
System.out.println(redisTest.set("test", "result"));
//使用get方法
System.out.println(redisTest.get("test"));
}
}
以上定义了一个类,里面有set和get两个方法,一个构造方法,就是这么简单,就模拟实现了redis的存储查询,当然,如果对redis更深层次的理解,可以仔细研究源码.