走进KeyDB( 二 )

http://

KeyDB项目是从redis fork出来的分支 。 众所周知redis是一个单线程的kv内存存储系统 , 而KeyDB在100%兼容redis API的情况下将redis改造成多线程 。

项目git地址:https://github.com/JohnSully/KeyDB

网上公开的技术细节比较少 , 本文基本是通过阅读源码总结出来的 , 如有错漏之处欢迎指正 。

多线程架构

线程模型

KeyDB将redis原来的主线程拆分成了主线程和worker线程 。 每个worker线程都是io线程 , 负责监听端口 , accept请求 , 读取数据和解析协议 。 如图所示:

KeyDB使用了SO_REUSEPORT特性 , 多个线程可以绑定监听同个端口 。

每个worker线程做了cpu绑核 , 读取数据也使用了SO_INCOMING_CPU特性 , 指定cpu接收数据 。

解析协议之后每个线程都会去操作内存中的数据 , 由一把全局锁来控制多线程访问内存数据 。

推荐阅读