Skip to content
Bert Young edited this page Dec 2, 2017 · 4 revisions
 _____     _____   _____   _   ______                  
/  _  \   | ____| |  _  \ | | /  ___/                        
| | | |   | |__   | | | | | | | |____
| | | |   |  __|  | | | | | |  \__   \
| |_| |_  | |___  | |_| | | |  ___|  |
\_______| |_____| |_____/ |_| /_____/

Welcome to the Qedis wiki!


什么是Qedis?

一个使用C++11编写的高度兼容Redis的内存数据库,可配置leveldb持久化使得单机容量突破内存。支持集群功能。

Qedis的来源

2014年底初学C++11,即兴想山寨一个简单的Redis练手。最初只实现了一些简单的数据结构指令,后来陆续加入了AOF、RDB持久化,主从复制,发布订阅等功能。在一年后的2015年10月,Qedis已初具雏形了,可以使用redis-benchmark测试性能,而后惊奇的发现性能数据竟然比Redis还要略好。证明我算是个及格的C++11程序员,更验证了C++标准库的高效率,完全不输对应的Redis中C实现的数据结构。

如何构建和运行

make && cd bin && ./qedis_server

Qedis代码结构介绍

  • 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达成这个目标,这也体现了QedisRedis的高度兼容。当然,如果要使用Qedis自带的集群功能,就必须使用QSentinel

sidebar测试

Clone this wiki locally