📜  arkk (1)

📅  最后修改于: 2023-12-03 14:59:22.973000             🧑  作者: Mango

arkk - 轻量级的单机键值存储引擎

arkk 是一个轻量级的单机键值存储引擎,基于 RocksDB 和 LevelDB,支持多种数据类型和 API,可用于存储各种数据,如 KV 数据、时序数据、配置信息等。

特性
  • 简单易用:提供丰富的 API,易于使用和集成。
  • 高性能:基于 RocksDB 和 LevelDB,具有卓越的读写性能。
  • 支持多种数据类型:支持字符串、整数、列表、集合等多种数据类型。
  • 支持事务:支持事务操作,保证数据一致性和完整性。
  • 支持过期时间:支持设置键的过期时间,自动删除过期的键值对。
  • 支持持久化:存储数据持久化,保证数据不丢失。
  • 线程安全:支持多线程并发访问,防止数据冲突。
  • 跨平台:支持在多种操作系统上使用。
安装和使用
安装
  • 安装前提:已安装 C++ 编译器和 RocksDB 和 LevelDB 库。
  • 安装方式:通过源码编译安装。
$ git clone git@github.com:icefox0801/arkk.git
$ cd arkk
$ make
$ make install
使用示例
#include <arkk.h>
#include <cstdio>

int main() {
    arkk::db_options opts;
    opts.create_if_missing = true;
    
    // 打开数据库
    arkk::db* db;
    arkk::status s = arkk::open(opts, "/path/to/db", &db);
    if (!s.ok()) {
        fprintf(stderr, "open database failed: %s\n", s.to_string().c_str());
        return -1;
    }

    // 写入键值对
    s = db->put("key", "value");
    if (!s.ok()) {
        fprintf(stderr, "write key-value pair failed: %s\n", s.to_string().c_str());
        return -1;
    }

    // 读取键对应的值
    std::string value;
    s = db->get("key", &value);
    if (s.ok()) {
        printf("value of key 'key': %s\n", value.c_str());
    } else {
        fprintf(stderr, "read value of key failed: %s\n", s.to_string().c_str());
    }

    // 删除键值对
    s = db->del("key");
    if (!s.ok()) {
        fprintf(stderr, "delete key 'key' failed: %s\n", s.to_string().c_str());
        return -1;
    }

    // 关闭数据库
    delete db;
    return 0;
}
API 文档
db_options

arkk::db_options 是数据库的配置选项,定义如下:

struct db_options {
    bool create_if_missing = false; // 如果为 true,则在数据库不存在时创建数据库。
    bool allow_overwrite = false; // 如果为 true,则允许多次插入同一个键对应的值,否则只插入一次。
    std::string path; // 数据库存储的路径。
};
status

arkk::status 表示操作是否成功,定义如下:

struct status {
    enum code {
        OK = 0,
        ERROR = 1,
        NOT_FOUND = 2,
        INVALID_ARGUMENT = 3,
        CORRUPTION = 4,
        IO_ERROR = 5
    };
    
    status() : code_(OK) {}
    
    // 将状态码转换为字符串
    std::string to_string() const;
    
    // 判断状态是否成功
    bool ok() const { return code_ == OK; }
    
    code code_;
};
db

arkk::db 是数据库的句柄,定义如下:

class db {
public:
    // 插入一个键值对
    status put(const std::string& key, const std::string& value);
    
    // 获取一个键对应的值
    status get(const std::string& key, std::string* value);
    
    // 删除一个键值对
    status del(const std::string& key);
    
    // 执行一次事务,仅在支持事务的数据库中生效,否则仅执行一次 put、get 或 del 操作
    status exec(const std::function<void()>& fn);
    
    // 关闭数据库
    void close();
};
原理介绍
数据结构

arkk 的数据结构包括:

  • 数据库配置选项(db_options):包含是否创建数据库、允许覆盖、存储路径等选项。
  • 状态码(status):包含状态码、状态描述等信息。
  • 数据库句柄(db):包含插入键值对、获取键对应的值、删除键值对、执行事务、关闭数据库等操作。
存储引擎

arkk 的存储引擎基于 RocksDB 和 LevelDB,具有卓越的读写性能和稳定性,支持多种数据类型和 API。

应用场景

arkk 可用于存储各种数据,如 KV 数据、时序数据、配置信息等,广泛应用于互联网和移动互联网领域,如用户数据存储、消息存储、日志存储、配置存储等。