-
Notifications
You must be signed in to change notification settings - Fork 40
Home
_____ _____ _____ _ ______
/ _ \ | ____| | _ \ | | / ___/
| | | | | |__ | | | | | | | |____
| | | | | __| | | | | | | \__ \
| |_| |_ | |___ | |_| | | | ___| |
\_______| |_____| |_____/ |_| /_____/
一个使用C++11
编写的高度兼容Redis
的内存数据库,可配置leveldb
持久化使得单机容量突破内存。支持集群功能。
2014年底初学C++11
,即兴想山寨一个简单的Redis练手。最初只实现了一些简单的数据结构指令,后来陆续加入了AOF、RDB持久化,主从复制,发布订阅等功能。在一年后的2015年10月,Qedis
已初具雏形了,可以使用redis-benchmark
测试性能,而后惊奇的发现性能数据竟然比Redis
还要略好。证明我算是个及格的C++11
程序员,更验证了C++标准库的高效率,完全不输对应的Redis
中C实现的数据结构。
make && cd bin && ./qedis_server
-
QBase
该目录是一个多线程
socket
网络库,毕业之初编写的,代码有点old fashion。使用了独立的读写网络线程分别处理读事件和写事件,所以一个连接后的socket fd对象被三个线程共享:main逻辑线程,recv线程和send线程。创建对象使用了shared_ptr
,在多线程中共享,最后一个析构shared_ptr
的线程会析构关闭socket。这里main线程和recv线程之间使用一个接收队列通信,main线程和send线程之间使用一个发送队列通信。 该代码在公司某项目中也稳定运行了四五年之久,由于极其稳定和不俗的性能,我不打算再替换了。而最近编写的集群proxy代码则使用了去年最新编写的ananas库,相对较为modern C++。
-
QedisCore
该目录是对应的Redis逻辑核心实现,依赖QBase。
-
UnitTest
简单的单元测试代码。
-
QedisSvr
该目录包含main函数,是Qedis启动初始化、运行的相关代码,主要依赖
QedisCore
。 -
Modules
该目录提供了动态库,包含了几个我扩展的命令。比如LDEL命令,提供index,从list中删除该index对应的元素。 你可以通过发送命令
module load your_dynamic_lib
来载入动态库,让Qedis在运行时支持添加自定义命令的功能。 -
Qedis.xcodeproj
xcode工程文件。
-
leveldb
并不能直接看到这个目录,在make的时候会自动下载
leveldb
,所以构建Qedis需要联网。 Qedis依赖leveldb
作为持久化引擎。和Redis的RDB或AOF不同的是,leveldb
存储全量的Qedis数据,所以单个Qedis的容量上限是硬盘空间,而单个Redis容量则受限于内存大小。 -
QSentinel
该目录所提供的功能可以理解为类似
redis-sentinel
,但与Redis使用raft
不同,这里直接借助于Zookeeper
这类成熟的组件(你也可以实现对应接口,用etcd
来替代,欢迎推送PR)。一组Qedis进程,通过
Zookeeper
选主,实现主从复制和failover,达到高可用的目标。事实上,你也可以直接使用redis-sentinel
达成这个目标,这也体现了Qedis
与Redis
的高度兼容。当然,如果要使用Qedis
自带的集群功能,就必须使用QSentinel
。