不同的计算机语言针对redis,都有自己的客户端。
官网上也列出了客户端的 http://www.redis.io/clients
java客户端如下:
感觉客户端无非也就是做些连接和拼接命令的事情。所以不费心思比较哪个好了,就选第一个吧。一般第一个应该都是不错的。
选择jedis ,发现他的代码是 GitHub 托管的,开源的。地址为 https://github.com/xetorthio/jedis
找到 maven dependency
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
将上面这段 xml,拷入 pom.xml 中(maven 依赖)
发现添加了 jedis-2.6.0.jar 和 commons-pool2-2.0.jar 这两个包。一个应该是核心包,一个appache的pool包,我猜是客户端连接池用到了。具体的还得往下走。
到目前为止,准备工作都ok.跑一个简单的例子如下:
Jedis jedis = new Jedis("10.13.145.75",6379); //默认端口6379
jedis.set("key", "HelloWorld");
String result = jedis.get("HelloWorld");
System.out.println(result);
注意,我这里报连接超时。
查了下,发现是redis服务器端防火墙造成的 。
service iptables stop把防火墙关了,再执行下代码。ok.完成了。
代码很简单,直接看下 jedis 的源代码是怎么实现的吧。
当调用 jedis.set("key", "HelloWorld"); 的时候
在Jedis.class 中,调用了String set(final String key, String value)
其中client 是客户端对象
/**
* Set the string value as value of the key. The string can't be longer than
* 1073741824 bytes (1 GB).
* <p>
* Time complexity: O(1)
*
* @param key
* @param value
* @return Status code reply
*/
public String set(final String key, String value) {
checkIsInMulti();
client.set(key, value);
return client.getStatusCodeReply();
}
在Client.class中
public void set(final String key, final String value) {其中 SafeEncoder.encode(String)是把字符串,安装utf-8字符集,转成 byte[]数组。
set(SafeEncoder.encode(key), SafeEncoder.encode(value));
}
然后相当于调用了父类
BinaryClient.class的 public void set(final byte[] key, final byte[] value)
public void set(final byte[] key, final byte[] value) {
sendCommand(Command.SET, key, value);
}
Connection.class 中 sendCommand 是所有发送命令的入口。command 是个枚举对象
protected Connection sendCommand(final Command cmd, final byte[]... args) {connect()方法就是传统的socket连接服务器的代码
try {
connect();
Protocol.sendCommand(outputStream, cmd, args);
pipelinedCommands++;
return this;
} catch (JedisConnectionException ex) {
// Any other exceptions related to connection?
broken = true;
throw ex;
}
}
Protocol.class
public static void sendCommand(final RedisOutputStream os,sendCommand 是所有发送命令的出口.直接给 redis-server 发送命令。说白了就是把 set key HelloWorld 的byte[] 字节发给redis-server了
final Command command, final byte[]... args) {
sendCommand(os, command.raw, args);
}
为了证实自己的猜测,特意抓了个包。
发现确实如自己猜测的那样。
至于get命令,也是类似。只是最后调用了。
client.sendCommand(Protocol.Command.GET, key);
抓包也看了下。向server请求时,请求了 GET key
抓取的报文如下:
redis-server 返回的 是Hello World .
抓取的报文如下:
最后贴一下 jedis 的 类图,大概画的。