CPHash是一个可以多核处理的并发hash表。CPHash将Hash表进行了分割,查询插入的时候使用信息传递的方式进入的各个分割的Hash表中.
上图是CPHash设计的概述,CPHash将hash表划分为相对独立的部分,每个hash部分都有一个独立的服务线程来管理对它的一些操作。
用户的操作传递给客户线程,然后客户线程通过信息传递的方式再跟相应的服务线程通信。客户线程相当于一个中介。
图二显示了每个被分割了的hash表包含的结构。其中包含了一个链表数组,替代策略使用的是LRU,所以还有一个LRU链表。表中的元素内容包含了一个头部和值。
信息传递中使用了在共享区预先分配的循环buffer,每一对客户线程和服务线程都有2个buffer数组,用来进行直接的通信。与该buffer相关的指针有
a read index,a write index,a temporary write index.
当要增加数据到该buffer中时,首先要确保read index大于temporary index.这样可以确保未读的数据不被新数据进行覆盖了。
当temporary write index 充分大于write index时,将write index改变为temporary write index进行刷新buffer.
当要读取数据时,需要等待read index小于writer index。然后才进行读取数据和跟新read index.
用户连接时的运行过程:用户使用TCP进行连接后,分配一个客户线程给用户,尽可能将用户的请求命令存储在同一块中,然后客户线程使用信息传递的方式将该请求块发送到相对应的服务器线程,服务器线程处理完后,将结果发给客户线程,然后客户线程再将该结果反馈给用户。