Jedis Commands API说明
本章主要针对Jedis源码中部分模块进行说明和简单分析,其中主要包括如下部分
- Commands API 说明
- Client & Connection职能说明
前提说明
- Jedis中提供两种Cluster模式,分别为:
- JedisCluster – 基于Redis官方提供的集群模式
- ShardedJedis – 基于ConsistentHash算法的集群模式
- Jedis提供的Client的类型共有三种:非集群的Jedis & 以上两种集群Jedis
Commands API 说明
1. Command类型说明
- Jedis中,为Commands提供了两种实现:1. String 类型的 Commands;2. byte[] 类型的 Commands
2. Jedis客户端的继承关系
- Jedis extends BinaryJedis
- JedisCluster extends BinaryJedisCluster
- ShardedJedis extends BinaryShardedJedis
3. 分布式操作支持(具体情况暂不细说)
- mget & mset
- JedisCluster 需要要求所有key都处于同一个slot中(存在Redirect情况)
- ShardedJedis 不支持
- Pipeline
- ShardedJedis 实现时 严格 记录了请求的顺序,同时,获取结果时,也是 严格 按照请求顺序获取
- JedisCluster 对 Pipeline 不提供支持(存在Redirect情况)
- Transaction
- JedisCluster & ShardedJedis 对 Transaction 都不提供支持
Client & Connection职能说明
1. 各组件功能说明
- Client:封装基于String类型的Commands请求
- BinaryClient:封装基于byte[]类型的Commands请求
- Connection:封装对连接的管理(connect & disconnect)及Commands的发送
- Protocol:封装与Redis Server通信的协议(排版 & 分隔符等)
2. 其他说明
- 由此可见,Jedis & Jedis & ShardedJedis 等都是对 能力(able)的封装,真正的实现还是基于Client
- 源码可知 Redis 以响应二进制流的首位的不同来表示不同情况(如想了解不同类型的区别,还需查阅Redis Server源码)
private static Object process(final RedisInputStream is) {
final byte b = is.readByte();
if (b == PLUS_BYTE) {
return processStatusCodeReply(is);
} else if (b == DOLLAR_BYTE) {
return processBulkReply(is);
} else if (b == ASTERISK_BYTE) {
return processMultiBulkReply(is);
} else if (b == COLON_BYTE) {
return processInteger(is);
} else if (b == MINUS_BYTE) {
processError(is);
return null;
} else {
throw new JedisConnectionException("Unknown reply: " + (char) b);
}
}