Watch 1 Star 0 Fork 0

wujehy / GeeJoanKVRustLGPL-3.0

Join us
Explore and code with more than 5 million developers,Free private repositories !:)
Sign up
一个简单的本地 Key-Value 操作库 , rust 和cpp 双实现 spread retract

Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

GeeJoanKV

介绍

一个简单的本地 C++ 实现的 Key-Value 数据库 ,

用于 GeeJoanServer 的 缓存

rust 版本

由于内存管理方面的原因, 决定用rust 重写 KeyValue 类

后期 Server 也会rust 重写的

由于持久化的协议相同, cpp 版本的 可以和rust 版本的 持久化文件互通

*uint8 的 持久化后会转化成i32

使用方法:


//!#toml
//![dependencies]
//!key_value = {path = "key_value"}

//! 案例源于 main.rs
//! 引用
use key_value::KeyValueTool;

// 示例化对象
let mut key_value_tool = key_value::new("testproject.gkv");

// 测试各种值
key_value_tool.set("test1", true);
key_value_tool.set("test2", 123i8);
key_value_tool.set("test3", 123i32);
key_value_tool.set("test4", 1233424423432423i64);
key_value_tool.set("test5", 1.234f32);
key_value_tool.set("test6", 1.234f64);
key_value_tool.set("test7", "stringtest");

// 遍历
key_value_tool.for_echo(|key:&str, v_type : &key_value::ValueType, value : String|{
    println!("key : {} , Type : {} , Value : {}" , key , v_type.to_string() , value);
}, false );

// 确定类型 的 获取
let get_type = key_value_tool.get_type("test3");
// 根据类型选择值 , 实际使用需要使用者根据type判断 
let get_value = key_value_tool.get_int32("test3");
println!("type : {} , value : {} ", get_type.unwrap() , get_value.unwrap());

// 序列化 与 反序列化
// 持久化
key_value_tool.save();
// 加载
let mut key_value_tool2 = key_value::new("testproject.gkv");
key_value_tool2.load();

key_value_tool2.for_echo(|key:&str, v_type : &key_value::ValueType, value : &String|{
    println!("key : {} , Type : {} , Value : {}" , key , v_type.to_string() , value.as_str());
}, false );

输出:

project_name : testproject.gkv 
key : test4 , Type : INT64 , Value : 1233424423432423
key : test5 , Type : FLOAT , Value : 1.234
key : test6 , Type : DOUBLE , Value : 1.234
key : test7 , Type : STRING , Value : stringtest
key : test3 , Type : INT32 , Value : 123
key : test2 , Type : INT8 , Value : 123
key : test1 , Type : BOOL , Value : True
type : INT32 , value : 123 
key : test4 , Type : INT64 , Value : 1233424423432423
key : test5 , Type : FLOAT , Value : 1.234
key : test6 , Type : DOUBLE , Value : 1.234
key : test3 , Type : INT32 , Value : 123
key : test7 , Type : STRING , Value : stringtest
key : test2 , Type : INT32 , Value : 123
key : test1 , Type : BOOL , Value : True

相对用c++ 实现起来要简单的多

下个版本就实现持久化 , 就可以替换为cpp 版本了

2020.06.05 : 完成 持久化操作

#cpp 版本

支持存储的类型

  • uint8
  • int32
  • int64
  • float
  • double
  • string (const char*)
  • bool
  • void *

编译:

$ cd ~/yourpath/GeeJoanKV
$ mkdir build 
$ cmake .. 
$ cmake --build . 
# 可选择 是否支持 持久化
# 构建参数 -DKV_PERSISTENT_SUPPORT=OFF , 或者 
# 修改 
#
# 是否编译持久化功能 , 默认支持
# option(KV_PERSISTENT_SUPPORT "Support persistent operation" ON)
# 为
# option(KV_PERSISTENT_SUPPORT "Support persistent operation" OFF)

第三方调用:

​ 动态库 或者只静态库 调用

# 编译完后 执行 安装指令
$ cmake install . 
#  在项目的 Linux.out/GeeJoanKV 目录
#  include  为 头文件目录
#  libs 为 库文件目录 直接链接 libGeeJoanKV 即可

​ cmake 源文件导入

#添加项目

add_subdirectory(yourpath/GeeJoanKV)
include_directories(yourpath/GeeJoanKV)
...
#链接的时候
target_link_libraries(YourTarget GeeJoanKV)

更新记录:

2020.05.31 :

​ 增加 持久化操作

注: void * 不支持持久化 , 如果需要支持 , 请自行实现 序列化规则

基础版本方法:

参照 testKeyValue.cpp

// 头文件
#include "Tools/KeyValueBase.h"

// 创建一个对象 
KeyValueBase server;

// 测试数据类型 
std::string testKey = "testKey";
int64_t  testInt =11;
// Set 引用传递
// Set2 拷贝传递
// 引用传递 , 更具参数的有无 选择 传递值的模式 Set 还是 Set2
server.Set(testKey , testInt) ;
// 浮点
server.Set2("testFloat" , 3.14159);
// bool
server.Set2("testBool" , true);
// int64
server.Set2("testint64" , (int64_t)124587);
// double
server.Set2("testDouble1" , (double)3.14159)
// 字符
server.Set2("testStr3" ,"testString3");

// 读取 
// Get  引用传递
// Get2 拷贝传递
KeyValueDataTypePort get = server.Get2("testKey");

// 根据值的类型 读取值 
// 读取类型 
ValueType dataType = get->getDataType(); //这里的这个 int64_t
// 然后根据类型 读取值 
int64_t valueData = get->getNumber64();

// 遍历 
server.ForEcho([](std::string key, KeyValueDataTypePort port){
    // 打印
    std::cout <<" Key = "<< key <<" , Value = " << port->getValue(true) <<std::endl;
    });

案例效果 :

get addr : 6e2d4fb0
get1 addr : 6e2d4fb0
get2 addr : 6e2d4fb0
get3 addr : 6e2d4fb0
 test get : 6e2d4fb0 , Value = 11 
 For Echo Start ... 
 Key = test , Value = (addr) 94692992441536
 Key = testBool , Value = (bool) 1
 Key = testDouble1 , Value = (double) 3.141590
 Key = testDouble2 , Value = (float) 3.141590
 Key = testDouble3 , Value = (double) 3.141590
 Key = testDouble4 , Value = (float) 3.141590
 Key = testFloat , Value = (double) 3.141590
 Key = testKey , Value = (int64) 11
 Key = testStr3 , Value = (string) testString3
 Key = testint64 , Value = (int64) 124587
 For Echo End ... 
 用户数据 释放内存中... 
 delete user Test Node id = 1 name = dada

测试案例:

​ 测试主机: 6500 + kubuntu20.04 + gcc 9.3.0

​ 基础使用测试

$ ./testKeyValue

output:
 size Type : 4
 size ValueDataBaseType : 1
 size ValueDataUInt8Type : 2
 size ValueDataBoolType : 2
 size ValueDataStringType : 24
 size ValueDataInt32Type: 8
 size ValueDataInt64Type : 16
 get addr : bb730820
get1 addr : bb730820
get2 addr : bb730820
get3 addr : bb730820
 test get : bb730820 , Value = 11 
 For Echo Start ... 
 Key = test , Value = (addr) 94793073102784
 Key = testBool , Value = True
 Key = testDouble1 , Value = (double) 3.141590
 Key = testDouble2 , Value = (float) 3.141590
 Key = testDouble3 , Value = (double) 3.141590
 Key = testDouble4 , Value = (float) 3.141590
 Key = testFloat , Value = (double) 3.141590
 Key = testKey , Value = (int64) 11
 Key = testStr3 , Value = (string) testString3
 Key = testint64 , Value = (int64) 124587
 For Echo End ... 
 用户数据 释放内存中... 
 delete user Test Node id = 1 name = dada

​ 序列化测试:

$ ./testSerial
output:
key : test1 , value : (int64) 123
key : test2 , value : (int64) 123
key : test3 , value : (int64) 123
key : test4 , value : (int64) 123
key : test5 , value : (int32) 123
key : test6 , value : (string) 123
key : test7 , value : (double) 1.234568
double : 1.234567890123000
key : test8 , value : (float) 1.234568
float : 1.234567880630493

Process finished with exit code 0

​ 性能测试:

​ 测试 : 100K 条数据 持久化 和 读取时间 (时间单位: 微秒)

 $ ./testSerial100k
 output:
 use time insert : 346282 μs 
 use time Save : 950571 μs 
 use time Load : 1175089 μs 
 test get time : 6 μs ,  Key20000 : (string) value20000

Comments ( 0 )

Sign in for post a comment

Rust
1
https://gitee.com/wujehy/GeeJoanKV.git
git@gitee.com:wujehy/GeeJoanKV.git
wujehy
GeeJoanKV
GeeJoanKV
master

Help Search