Redis是一款基于key-value的数据库服务器,安装完成后我们可以通过redis-cli使用Redis提供的命令完成各种操作。redis-cli实际上就是一款客户端,和redis-server建立网络连接,然后以一定的格式(称为网络协议)向服务器端发送数据,redis-server根据客户端的请求进行处理并返回相应的结果。
使用Java操作Redis,本质上就是编写Redis的客户端应用,因此我们必须了解Redis自定义的网络协议。
Redis协议官方地址:http://redis.io/topics/protocol
请求协议的一般格式为:
*<参数的个数> CR LF
$<参数1字节数> CR LF
<参数1> CR LF
...
$<参数n字节数> CR LF
<参数n> CR LF
举个例子:set name Jane命令应该对应的以下形式
*3 CR LF //三个参数
$3 CR LF //第一个参数set有3个字节
SET CR LF //参数内容set
$4 CR LF //第二个参数name占4个字节
name CR LF //参数二内容 name
$4 CR LF //第三个参数有4个字节
Jane CR LF//参数三内容 Jane
对应的字符串形式为"*3
$3
set$4
name$4
Jane
。
Redis命令会返回多种不同类型的回复,通过检查返回数据的第一个字节可以确定具体的类型:
- 状态回复(status reply)的第一个字节是 “+”
- 错误回复(error reply)的第一个字节是 “-“
- 整数回复(integer reply)的第一个字节是 “:”
- 批量回复(bulk reply)的第一个字节是 “$”
- 多条批量回复(multi bulk reply)的第一个字节是 “*”
了解了这些后我们就可以在Java中和Redis服务器建立Socket连接,然后將指令按照Redis协议格式发送到服务器端,从而达到操作Redis的目的。
代码如下:
try {
Socket sock = new Socket("127.0.0.1",6379);
OutputStream out = sock.getOutputStream();
InputStream in = sock.getInputStream();
//set name rongbo_j
String sendStr =
"*3
$3
SET
$4
name
$8
rongbo_j
";
out.write(sendStr.getBytes());
//get name
sendStr = "*2
$3
GET
$5
name
";
out.write(sendStr.getBytes());
byte[] buffer = new byte[512];
in.read(buffer);
System.out.println(new String(buffer));
} catch (Exception e) {
e.printStackTrace();
}
可以看到如果不对代码进行封装,使用起来是相当繁琐的,下一篇文章介绍如何使用Jedis工具来简化操作。