Crates.io | kip_db |
lib.rs | kip_db |
version | 0.1.2-alpha.26.fix1 |
source | src |
created_at | 2022-10-14 05:30:59.159336 |
updated_at | 2024-04-28 09:02:39.015799 |
description | 轻量级、异步 基于LSM Leveled Compaction K-V数据库 |
homepage | |
repository | https://github.com/KipData/kipdb |
max_upload_size | |
id | 687957 |
size | 762,185 |
KipDB 轻量级键值存储引擎
整体设计参考LevelDB,旨在作为NewSQL分布式数据库的存储引擎
组件原理Wiki : https://github.com/KKould/KipDB/wiki
Tips: 使用RPC时请确保 Protocol Buffer Compiler 已安装。
kip_db = "0.1.2-alpha.15 "
# 代码编译
cargo build
# 代码编译(正式环境)
cargo build --release
# 单元测试
cargo test
# 性能基准测试
cargo bench
# 编译镜像
docker build -t kould/kip-db:v1 .
# 运行镜像
docker run kould/kip-db:v1
/// 指定文件夹以开启一个KvStore
let kip_db = LsmStore::open("/welcome/kip_db").await?;
// 插入数据
kip_db.set(&b"https://github.com/KKould/KipDB", Bytes::from(&b"your star plz"[..])).await?;
// 获取数据
let six_pence = kip_db.get(&b"my deposit").await?;
// 已占有硬盘大小
let just_lot = kip_db.size_of_disk().await?
// 已有数据数量
let how_many_times_you_inserted = kip_db.len().await?;
// 删除数据
kip_db.remove(&b"ex girlfriend").await?;
// 创建事务
let mut transaction = kip_db.new_transaction().await?;
// 插入数据至事务中
transaction.set(&b"this moment", Bytes::from(&b"hope u like it"[..]));
// 删除该事务中key对应的value
transaction.remove(&b"trouble")?;
// 获取此事务中key对应的value
let ping_cap = transaction.get(&b"dream job")?;
// 提交事务
transaction.commit().await?;
// 创建持久化数据迭代器
let guard = kip_db.iter().await?;
let mut iterator = guard.iter()?;
// 获取下一个元素
let hello = iterator.next_err()?;
// 移动至第一个元素
let world = iterator.seek(Seek::Last)?;
// 强制数据刷入硬盘
kip_db.flush().await?;
/// 服务端启动!
let listener = TcpListener::bind("127.0.0.1:8080").await?;
kip_db::net::server::run(listener, tokio::signal::ctrl_c()).await;
/// 客户端调用!
let mut client = Client::connect("127.0.0.1:8080").await?;
// 插入数据
client.set(&vec![b'k'], vec![b'v']).await?
// 获取数据
client.get(&vec![b'k']).await?
// 已占有硬盘大小
client.size_of_disk().await?
// 存入指令数
client.len().await?
// 数据刷入硬盘
client.flush().await?
// 删除数据
client.remove(&vec![b'k']).await?;
// 批量指令执行(可选 并行/同步 执行)
let vec_batch_cmd = vec![CommandData::get(b"k1".to_vec()), CommandData::get(b"k2".to_vec())];
client.batch(vec_batch_cmd, true).await?
PS D:\Workspace\kould\KipDB\target\release> ./server -h
KipDB-Server 0.1.0
Kould <2435992353@qq.com>
A KV-Store server
USAGE:
server.exe [OPTIONS]
OPTIONS:
-h, --help Print help information
--ip <IP>
--port <PORT>
-V, --version Print version information
PS D:\Workspace\kould\KipDB\target\release> ./server
2022-10-13T06:50:06.528875Z INFO kip_db::kernel::lsm::ss_table: [SsTable: 6985961041465315323][restore_from_file][TableMetaInfo]: MetaInfo { level: 0, version: 0, data_len: 118, index_len: 97, part_size: 64, crc_code: 43553795 }, Size of Disk: 263
2022-10-13T06:50:06.529614Z INFO kip_db::net::server: [Listener][Inbound Connections]
2022-10-13T06:50:13.437586Z INFO kip_db::net::server: [Listener][Shutting Down]
PS D:\Workspace\kould\KipDB\target\release> ./cli --help
KipDB-Cli 0.1.0
Kould <2435992353@qq.com>
Issue KipDB Commands
USAGE:
cli.exe [OPTIONS] <SUBCOMMAND>
OPTIONS:
-h, --help Print help information
--hostname <hostname> [default: 127.0.0.1]
--port <PORT> [default: 6333]
-V, --version Print version information
SUBCOMMANDS:
batch-get
batch-remove
batch-set
flush
get
help Print this message or the help of the given subcommand(s)
len
remove
set
size-of-disk
PS D:\Workspace\kould\KipDB\target\release> ./cli batch-set kould kipdb welcome !
2022-09-27T09:50:11.768931Z INFO cli: ["Done!", "Done!"]
PS D:\Workspace\kould\KipDB\target\release> ./cli batch-get kould kipdb
2022-09-27T09:50:32.753919Z INFO cli: ["welcome", "!"]
docker build -t kould/kip-db:v1 .
docker build -f Dockerfile-perf -t kould/perf:v1 .
docker run kould/kip-db:v1
attach-win.sh <kip-db容器ID>
./attach-win.sh 263ad21cc56169ebec79bbf614c6986a78ec89a6e0bdad5e364571d28bee2bfc
record.sh <kip-db的server进程pid>
. plot.sh <图片名.svg>
, 即可生成火焰图
docker cp
和 docker exec
或挂载 volume,为方便预览和复制文件,容器内置了轻量网页服务,执行 thttpd -p <端口号>
即可。由于脚本中没有设置端口转发,需要 docker inspect <目标容器ID> | grep IPAdress
查看目标容器的 IP,然后在浏览器中访问即可。若需要更灵活的操作,可不用以上脚本手动添加参数运行容器。参考自:https://chinggg.github.io/post/docker-perf/