1个不稳定版本
0.1.0 | 2023年11月25日 |
---|
#870 in 数据结构
29KB
465 行
GrausDb
GrausDb 是一个用 Rust 编写的高性能、线程安全的关键字值嵌入式数据存储。它旨在实现简单性、效率和可靠性。
特性
- 无锁并发: GrausDb 利用无锁数据结构以实现高性能并发访问。
- 持久性: 数据持久化到磁盘,以确保数据的持久性。
- 基于日志的存储: 键值对存储在日志文件中。
- 基准测试: 包含基准测试以评估性能。
安装
要在 Rust 项目中使用 GrausDb,只需将其添加到您的 Cargo.toml
文件中的依赖项即可
[dependencies]
graus_db = "0.1.0"
快速入门
以下是一个如何在 Rust 应用程序中使用 GrausDb 的快速示例
let store = GrausDb::open("path")?;
store.set("key".to_owned(), "value".to_owned())?;
let val = store.get("key".to_owned())?;
它也可以从多个线程中调用
let store = GrausDb::open("path")?;
// Calls set method from 8 different threads
for i in 0..8 {
let store = store.clone();
thread::spawn(move || {
store.set(format!("key{}", i), format!("value{}", i)).unwrap();
});
}
API
GrausDb 提供了一个简单直观的 API,用于与键值存储进行交互。以下是一些 GrausDb 暴露的 key 函数和方法以及使用示例。
GrausDb::open
open
用于打开 GrausDb 实例,如果指定的路径不存在,则创建新的数据库。
示例
use graus_db::{GrausDb, Result};
fn main() -> Result<()> {
let store = GrausDb::open("my_database")?;
// Your database is now ready to use.
Ok(())
}
set
set
方法用于在数据库中存储键值对。
示例
use graus_db::{GrausDb, Result};
fn main() -> Result<()> {
let store = GrausDb::open("my_database")?;
store.set("key".to_owned(), "value".to_owned())?;
// Key "key" now has the value "value" in the database.
Ok(())
}
get
get
方法检索与给定键关联的值。
示例
use graus_db::{GrausDb, Result};
fn main() -> Result<()> {
let store = GrausDb::open("my_database")?;
store.set("key".to_owned(), "value".to_owned())?;
if let Some(value) = store.get("key".to_owned())? {
println!("Value: {}", value); // Outputs: "Value: value"
} else {
println!("Key not found");
}
Ok(())
}
remove
remove
方法从数据库中删除键及其相关联的值。
示例
use graus_db::{GrausDb, Result};
fn main() -> Result<()> {
let store = GrausDb::open("my_database")?;
store.set("key".to_owned(), "value".to_owned())?;
store.remove("key".to_owned())?;
// Key "key" and its value are now removed from the database.
Ok(())
}
update_if
update_if
方法原子地更新现有键的值,允许您提供自定义更新函数。
可以传递一个可选的谓词,只有当谓词满足时,值才会更新。
示例
use graus_db::{GrausDb, Result};
fn main() -> Result<()> {
let key = ¨key1¨;
store.set(key.to_owned(), "25".to_owned()).unwrap();
let update_fn = |value: String| {
let num = value.parse::<i32>().unwrap();
(num - 1).to_string()
};
let predicate = |value: String| {
let num = value.parse::<i32>().unwrap();
num > 0
};
let result = store.update_if(
key.to_owned(),
update_fn,
Some(key.to_owned()),
Some(predicate),
);
// Key "key1" now has the value "24" in the database.
// The function was applied because the predicate was met (25 > 0)
}
有关如何使用 GrausDb 的更多详细信息,请参阅测试。
架构和实现
GrausDb 的架构基于基于日志的存储和无锁并发原则
-
基于日志的存储:GrausDb 将键值对存储在日志文件中。日志文件以单调递增的生成编号和日志扩展名命名。这种设计确保数据持久地存储到磁盘。
-
无锁并发:GrausDb 使用无锁数据结构来提供对数据的高性能并发访问。这使多个线程能够有效地与数据库交互。
-
内存索引:GrausDb维护一个内存索引,将键映射到日志中的位置。这个索引允许快速查找和高效的数据检索。
-
压缩:为了保持高效的存储并减少磁盘空间使用,当达到阈值时,GrausDb会进行压缩。压缩涉及重写日志文件、删除过时数据并回收磁盘空间。
基准测试
GrausDb包含内置的基准测试工具,以评估其效率并帮助您做出数据驱动决策。
未来开发
下一个功能
- 多线程基准测试
- 范围获取
- 同步API(日志)
- 内部线程池 + futures
许可证
GrausDb遵循MIT许可证。
用GrausDb愉快地编码!
联系方式
GrausDb由Ricardo Pallas创建和维护。
依赖关系
~1.1–2.1MB
~43K SLoC