oh, something cool. just for fun
base from OneValue
项目简介:
- 多线程
Reactor模型,主线程监听连接请求,8子线程处理收发包和业务逻辑,底层配置多个LevelDb构成LevelDbCluster - 支持主从同步,
Binlog实现机制 Redis客户端协议,可复用redis-cli
关键类:
Mouse:继承于Server,服务的主体类,启动函数runMouseSvr,读取配置文件、初始化CmdTable、LeveldbCluster、EventLoopThreadPool、SyncThreadCmdTable: 管理端CMD到Handle的映射,如GET/SET/DEL/SYNC/COPY等LeveldbCluster:管理端多个LevelDb,封装GET/SET/DEL,同步写BinLogEventLoopThreadPool:线程池,Mouse监听到客户端连接后,将fd注册到某个thread的event_loop中,创建Context,监听client读写事件Context:redis-cli的上下文信息,包含server指针、io buf、event_loop指针SyncThread:从节点用于从主节点同步数据的线程DbCopyThread: 用于节点A拷贝数据给节点B,遍历整个LevelDbCluster
关键类:
LogItem一条日志信息BinLog单个日志文件BinlogFileList日志文件列表类BinlogSyncStream主从同步时的一条数据流BinlogBufferReader主节点读取binLog记录类SyncThread为Slave节点的同步线程,向Master节点发送__SYNC命令,然后接收数据写存储DbCopyThread当A节点收到B节点__COPY命令时,在后台启动Copy线程,伪装客户端建立同节点B的链接,然后遍历LevelDB,将数据同步到节点B中
单条操作binLog日志信息,LogItem示意图如下,存储于binlog目录下多个文件,binlog文件的索引存在于BINLOG_INDEX;Slave节点的
同步偏移信息存储于MASTER_INFO文件中。
- Log
- levelDb
- binlog
- master-slave
- restful api
- multi work process
- support cas
- support set,list,hash
20180714 Tag1.0 单线程done,默认配置8个leveldb
20200329 Tag2.0 多线程+Binlog主从同步 done
ubuntu@VM-0-3-ubuntu:~/tool/redis-4.0.0/src$ ./redis-benchmark -h localhost -p 10086 -t set,get -c 10 -n 10000 -q
SET: 14306.15 requests per second
GET: 18315.02 requests per second
作为对比,redis4.0 benchmark信息
ubuntu@VM-0-8-ubuntu:~/github/redis-4.0.10/src$ ./redis-benchmark -h localhost -t set,get -c 10 -n 10000 -q
SET: 52356.02 requests per second
GET: 51282.05 requests per second
腾讯云 1核 1GB 2Mbps

