在Netty和redission中都使用了java的public interface Future<V> 模式。
理解redission的核心流程关键在于Future模式,关键代码在RedisClient 构造函数中。
在RedisClient中初始化Channel的时候,用到了ConnectionWatchdog CommandEncoder CommandsListEncoder CommandsQueue CommandDecoder
ConnectionWatchdog 功能是实现了断线重连的功能。在上一篇博客中已经提及。
CommandEncoder CommandsListEncoder CommandsQueue 这三个类与写操作有关系。
CommandDecoder 与 读取数据有关系。
redis协议使用请求-回应模式, 而netty网络层使用了异步Nio模式,所以redission使用了Future 模式,使把请求和回应关联在一起。 每一个请求消息都关联了Promise .
当消息收到时,找到关联的promise . redission提供了异步和同步读写模式。
既然,redis协议采用了请求-回应模式。所以,在redission中我们先来看看写操作。
RedisConnection.send(CommandData<T,R>)
public <T, R> ChannelFuture send(CommandData<T, R> data) {
return channel.writeAndFlush(data);
}
当写数据时,会进入第一个CommandsQueue ChannelOutboundHandler .进行处理。
在CommandsQueue 处理的数据类型为QueueCommand 接口。
代码如下:
public interface QueueCommand {
List<CommandData<Object, Object>> getPubSubOperations();
}
CommandData 为