走进KeyDB( 四 )


用来表示链接属于哪个线程接管 。

KeyDB维护了三个关键的数据结构做链接管理:

  • clients_pending_write:线程专属的链表 , 维护同步给客户链接发送数据的队列

  • clients_pending_asyncwrite:线程专属的链表 , 维护异步给客户链接发送数据的队列

  • clients_to_close:全局链表 , 维护需要异步关闭的客户链接

分成同步和异步两个队列 , 是因为redis有些联动api , 比如pub/sub , pub之后需要给sub的客户端发送消息 , pub执行的线程和sub的客户端所在线程不是同一个线程 , 为了处理这种情况 , KeyDB将需要给非本线程的客户端发送数据维护在异步队列中 。 同步发送的逻辑比较简单 , 都是在本线程中完成 , 以下图来说明如何同步给客户端发送数据:

如上文所提到的 , 一个链接的创建、接收数据、发送数据、释放链接都必须在同个线程执行 。 异步发送涉及到两个线程之间的交互 。 KeyDB通过管道在两个线程中传递消息:

推荐阅读