轻量级K-V数据库:支持事务ACID、兼容Redis命令
- 跨平台
- 读写性能接近Redis
- crash-safe
- 支持事务ACID
- 支持key前缀模糊匹配
- 崩溃恢复、数据备份或迁移操作简单
- 使用RESP 3协议与客户端通信,兼容Redis命令,可直接使用现有的Redis客户端
- 所有key均维护在内存中
FoxbatDB内存索引结构采用字典树(Trie树),以实现key的前缀模糊快速匹配;
此外,为了解决普通Trie占用内存过多的问题,采用基于burst-trie原理实现的HAT-trie[1]
作为实际的内存索引结构。
FoxbatDB磁盘数据存储使用预写日志(Write Ahead Log),
数据日志文件为只追加写入(append-only)文件,以获得较佳的写入性能。
存储策略参考Bitcask[2]实现。
FoxbatDB事务可视为Redis事务的ACID扩展,与Redis共用事务命令,但保证ACID:
- 原子性(Atomic):若事务包含写操作,一旦事务执行期间发生错误,将自动回滚
- 隔离性(Isolation):通过Watch乐观锁机制实现,与Redis一致
- 持久性(Durability):若事务包含写操作,将在执行期间将事务执行状态和写入数据一起持久化到磁盘上(File Record结构中的Tx State)
- 一致性(Consistency):在加载历史数据时,通过检查记录的事务执行状态,保证即使事务执行期间系统故障也能将数据库恢复到确定状态
- CPU缓存优化:需要频繁使用的数据结构,其内存均对齐CPU L1缓存行大小
- 内存使用优化:需频繁创建/销毁的数据结构,实现其专用的对象池,以减少内存碎片和动态内存分配/释放的开销
- 数据库操作
- SELECT
- HELLO
- MOVE
- 事务
- MULTI
- EXEC
- DISCARD
- WATCH
- UNWATCH
- 发布-订阅模式
- PUBLISH
- SUBSCRIBE
- UNSUBSCRIBE
- Key-Value操作
- 读
- GET
- EXISTS
- GETRANGE
- MGET
- STRLEN
- TTL
- PTTL
- 写
- SET
- MSET
- APPEND
- 删
- DEL
- 改
- RENAME
- INCR
- DECR
- INCRBY
- DECRBY
- INCRBYFLOAT
- 读
- MERGE:合并磁盘上的数据日志文件;成功时返回OK,失败时返回具体错误
- PREFIX:查询符合特定前缀的Key-Value;以数组格式(key1, value1, key2, value2....)返回匹配的Key-Value
- Linux/Mac OS
mkdir build
cd build
cmake ..
make
- Windows
Micoosoft官方文档:编译CMake项目
- 使用google/benchmark进行性能测试
- 使用locust进行压力测试,
- 读写平均耗时10ms左右。