概述
本文描述twemproxy0.4对批量消息处理命令的实现原理。这些命令例如:mset,mget等。
引言
当客户端发送的是批处理命令(如:mset,hset等)时,可能出现同一条命令的多个key分别发送到多个后端服务器的情况。
例如如下命令:
mget key1 key2 key3
假如后端的redis集群有两台redis服务器,则可能出现以下key分配情况:
key1 => redis server 0
key2 => redis server 1
key3 => redis server 0
key1和key3分别被分配到了redis server 0,而key2被分配到了redis server 1。twemproxy必须分别从后端的两个redis server分别获取数据,并把获取到的数据组合在一起,然后返回给客户端。
本文分析twemproxy对批处理命令的处理原理。
数据结构支持
要想实现批处理命令,首先需要数据结构支持,我们来看一下twemproxy的数据结构如何支持批处理命令的:
msg结构
struct msg {
…
struct msg *frag_owner;
uint32_t nfrag;
uint32_t nfrag_done;
uint64_t frag_id;
struct msg **frag_seq;
…
}
变量名 | 说明 |
---|---|
frag_owner | frag的拥有者,每个frag都属于某个msg,也可能是它自己 |
nfrag | 该msg拥有frag的个数,若自己是一个分片,则该值为0 |
nfrag_done | 是否fragment完成 |
frag_id | frag的编号,所有子frag的编号和owner的相同 |
frag_seq | frag的数组,这是一个msg的指针的数组 |
msg结构举例
若执行以下命令:
mget key1 key2 key3
假如后端的redis集群有两台redis服务器,则可能出现以下key分配情况:
key1 => redis server 0
key2 => redis server 1
key3 => redis server 0
得到的数据结构示意图如下所示:
批处理命令的处理流程
服务器接收到客户端的批处理命令后,会把命令分解成fragment的数据结构形式进行保存。然后按下面的流程进行处理:

命令组合完成后,会把批处理命令转发到对应的后端服务器。然后按《twemproxy0.4原理分析-消息处理过程详解
》分析的消息处理流程进行处理。
总结
本文分析了twemproxy对客户端发送的批处理命令的实现原理。