走进KeyDB( 五 )

int fdCmdWrite; //写管道

int fdCmdRead; //读管道

本地线程需要异步发送数据时 , 先检查client是否属于本地线程 , 非本地线程获取到client专属的线程ID , 之后给专属的线程管到发送AE_ASYNC_OP::CreateFileEvent的操作 , 要求添加写socket事件 。 专属线程在处理管道消息时将对应的请求添加到写事件中 , 如图所示:

redis有些关闭客户端的请求并非完全是在链接所在的线程执行关闭 , 所以在这里维护了一个全局的异步关闭链表 。

锁机制

KeyDB实现了一套类似spinlock的锁机制 , 称之为fastlock 。
fastlock的主要数据结构有:

使用原子操作__atomic_load_2 , __atomic_fetch_add , __atomic_compare_exchange来通过比较m_active=m_avail判断是否可以获取锁 。
fastlock提供了两种获取锁的方式:

推荐阅读