本文摘自PHP中文网,作者步履不停,侵删。
前言
我们用过很多redis的客户端,有没有相过自己撸一个redis客户端?
其实很简单,基于socket,监听6379端口,解析数据就可以了。
redis协议
解析数据的过程主要依赖于redis的协议了。
我们写个简单例子看下redis的协议:
1 2 3 4 5 6 | public class RedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis( "127.0.0.1" , 6379);
jedis.set( "eat" , "I want to eat" );
}
}
|
监听socket:
1 2 3 4 5 6 7 | public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(6379);
Socket socket = server.accept();
byte[] chars = new byte[64];
socket.getInputStream().read(chars);
System.out.println( new String(chars));
}
|
看下数据:
1 2 3 4 5 6 7 | *3
$3
SET
$3
eat
$13
I want to eat
|
参照官方协议文档https://redis.io/topics/protocol,解析下数据。
(1)简单字符串 Simple Strings, 以 "+"加号 开头
(2)错误 Errors, 以"-"减号 开头
(3)整数型 Integer, 以 ":" 冒号开头
(4)大字符串类型 Bulk Strings, 以 "$"美元符号开头,长度限制512M
(5)组类型 Arrays,以 "*"星号开头
并且,协议的每部分都是以 "\r\n" (CRLF) 结尾的。
所以上面的数据的含义是:
1 2 3 4 5 6 7 | *3 数组包含3个元素,分别是SET、eat、I want to eat
$3 是一个字符串,且字符串长度为3
SET 字符串的内容
$3 是一个字符串,且字符串长度为3
eat 字符串的内容
$13 是一个字符串,且字符串长度为13
I want to eat 字符串的内容
|
执行get 'eat'的数据如下:
撸一个客户端
掌握了redis协议,socket之后,我们就可以尝试撸一个客户端了。
socket:
1 2 3 4 5 6 7 8 9 10 | public RedisClient(String host, int port){
try {
this.socket = new Socket(host,port);
this.outputStream = this.socket.getOutputStream();
this.inputStream = this.socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
|
set协议:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public String set( final String key, String value) {
StringBuilder sb = new StringBuilder();
sb.append( "*3" ).append( "\r\n" );
sb.append( "$3" ).append( "\r\n" );
sb.append( "SET" ).append( "\r\n" );
sb.append( "$" ).append(key.length()).append( "\r\n" );
sb.append(key).append( "\r\n" );
sb.append( "$" ).append(value.length()).append( "\r\n" );
sb.append(value).append( "\r\n" );
byte[] bytes= new byte[1024];
try {
outputStream.write(sb.toString().getBytes());
inputStream.read(bytes);
} catch (IOException e) {
e.printStackTrace();
}
return new String(bytes);
}
|
测试:
1 2 3 | RedisClient redisClient = new RedisClient( "127.0.0.1" , 6379);
String result = redisClient.set( "eat" , "please eat" );
System.out.println(result);
|
执行结果:
更多Redis相关技术文章,请访问Redis教程栏目进行学习!
以上就是Redis协议是什么样的的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
总结三种Redis的启动方式
window 下Redis的安装步骤
Redis 中如何使用 scan 替换 keys
php中Redis和memcache区别
Redis该缓存什么数据
什么是Redis?
Redis实现限速器的几种方式
Redis运维之shell的使用――统计内存、定期备份、基准测试
Redis限制ip访问次数的方法
Redis怎么清理缓存
更多相关阅读请进入《Redis》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » Redis协议是什么样的