Rust高效KV存储库irg-kvariants的使用:高性能键值对数据结构与变体操作库

Rust高效KV存储库irg-kvariants的使用:高性能键值对数据结构与变体操作库

简介

kvariants是一个Rust库,提供了高效的键值对数据结构和变体操作功能。它基于@hfhchan开发的kVariants字典实现。

使用示例

以下是基本使用示例代码:

use kvariants::KVARIANTS;

let c = '澚';

let kvariant = match KVARIANTS.get(&c) {
    Some(kvariant) => kvariant.destination_ideograph,
    None => c,
};

assert_eq!(kvariant, '澳');

完整示例代码

// 引入kvariants库
use kvariants::KVARIANTS;

fn main() {
    // 示例1: 基本使用 - 查找字符变体
    let c1 = '澚';
    let result1 = match KVARIANTS.get(&c1) {
        Some(kvariant) => kvariant.destination_ideograph,
        None => c1,
    };
    println!("'{}'的变体字符是: '{}'", c1, result1);

    // 示例2: 处理字典中不存在的字符
    let c2 = 'A';
    let result2 = match KVARIANTS.get(&c2) {
        Some(kvariant) => kvariant.destination_ideograph,
        None => c2,
    };
    println!("'{}'没有对应的变体字符,返回原字符: '{}'", c2, result2);

    // 示例3: 批量处理字符数组
    let characters = ['澚', '焗', '𬒗', 'B', '焗'];
    for &c in &characters {
        let variant = KVARIANTS.get(&c).map_or(c, |kv| kv.destination_ideograph);
        println!("处理字符 '{}' => '{}'", c, variant);
    }

    // 示例4: 统计变体转换成功率
    let test_chars = ['澚', '焗', '𬒗', 'X', 'Y', 'Z'];
    let total = test_chars.len();
    let converted: usize = test_chars.iter()
        .map(|&c| KVARIANTS.get(&c).is_some() as usize)
        .sum();
    
    println!("\n测试统计:");
    println!("测试字符数: {}", total);
    println!("成功转换数: {}", converted);
    println!("转换成功率: {:.2}%", (converted as f32 / total as f32) * 100.0);
}

更新字典

字典文件存储在dictionaries/source/目录中,可以使用bin/sync_dictionaries脚本更新到最新版本。

安装

在Cargo.toml中添加以下依赖:

[dependencies]
irg-kvariants = "0.1.1"

或者运行以下命令:

cargo add irg-kvariants

许可证

该项目使用MIT许可证。


1 回复

Rust高效KV存储库irg-kvariants使用指南

irg-kvariants是一个高性能的键值对存储库,提供了多种变体操作功能,专为Rust语言设计。

主要特性

  • 高性能内存键值存储
  • 支持多种数据变体
  • 线程安全操作
  • 低内存开销
  • 灵活的序列化选项

基本使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
irg-kvariants = "0.1"  # 请使用最新版本

基本KV操作示例

use irg_kvariants::KVStore;

fn main() {
    // 创建新的KV存储
    let mut store = KVStore::new();
    
    // 插入键值对
    store.insert("name", "Alice");
    store.insert("age", 30);
    store.insert("active", true);
    
    // 获取值
    if let Some(name) = store.get::<&str>("name") {
        println!("Name: {}", name);
    }
    
    // 检查键是否存在
    if store.contains_key("age") {
        println!("Age exists in store");
    }
    
    // 删除键
    store.remove("active");
}

变体操作

irg-kvariants支持多种数据变体操作:

use irg_kvariants::{KVStore, Variant};

fn variant_operations() {
    let mut store = KVStore::new();
    
    // 插入不同类型的值
    store.insert_variant("mixed", Variant::Int(42));
    store.insert_variant("text", Variant::String("hello".to_string()));
    store.insert_variant("flag", Variant::Bool(true));
    
    // 获取并处理变体
    if let Some(Variant::Int(num)) = store.get_variant("mixed") {
        println!("Got number: {}", num);
    }
    
    // 类型转换
    if let Some(str_val) = store.get_variant("mixed").and_then(|v| v.as_str()) {
        println!("As string: {}", str_val);
    }
}

高级功能

批量操作

use irg_kvariants::KVStore;

fn batch_operations() {
    let mut store = KVStore::new();
    
    // 批量插入
    store.extend(vec![
        ("key1", "value1"),
        ("key2", 100),
        ("key3", true),
    ]);
    
    // 获取所有键
    for key in store.keys() {
        println!("Key: {}", key);
    }
    
    // 清空存储
    store.clear();
}

持久化支持

use irg_kvariants::{KVStore, PersistenceOptions};

fn persistence() {
    let mut store = KVStore::new();
    store.insert("data", "important information");
    
    // 保存到文件
    store.save_to_file("data.kv", PersistenceOptions::default())
        .expect("Failed to save");
    
    // 从文件加载
    let loaded_store = KVStore::load_from_file("data.kv")
        .expect("Failed to load");
    
    println!("Loaded data: {:?}", loaded_store.get::<&str>("data"));
}

性能提示

  1. 对于大量数据,考虑预分配容量:

    let mut store = KVStore::with_capacity(10_000);
    
  2. 使用&str作为键而不是String可以减少内存分配

  3. 对于只读操作,使用getget_mut更高效

irg-kvariants为Rust开发者提供了一个灵活且高效的键值存储解决方案,特别适合需要处理多种数据类型和需要高性能访问的场景。

完整示例Demo

下面是一个结合了基本操作、变体操作和持久化功能的完整示例:

use irg_kvariants::{KVStore, Variant, PersistenceOptions};

fn main() {
    // 创建一个预分配容量的KV存储
    let mut store = KVStore::with_capacity(100);
    
    // 基本KV操作
    store.insert("username", "rustacean");
    store.insert("login_count", 5);
    
    // 变体操作
    store.insert_variant("temp_data", Variant::Float(3.14));
    store.insert_variant("config", Variant::String("debug".to_string()));
    
    // 批量插入
    store.extend(vec![
        ("feature_flag", true),
        ("max_connections", 1000),
    ]);
    
    // 数据持久化
    store.save_to_file("app_data.kv", PersistenceOptions::default())
        .expect("Failed to save data");
    
    // 从文件加载数据
    let loaded_store = KVStore::load_from_file("app_data.kv")
        .expect("Failed to load data");
    
    // 查询演示
    println!("=== 存储内容 ===");
    for key in loaded_store.keys() {
        if let Some(value) = loaded_store.get_variant(key) {
            println!("Key: {}, Value: {:?}", key, value);
        }
    }
    
    // 类型安全获取示例
    if let Some(count) = loaded_store.get::<i32>("login_count") {
        println!("用户登录次数: {}", count);
    }
    
    // 变体类型转换
    if let Some(flag) = loaded_store.get_variant("feature_flag")
        .and_then(|v| v.as_bool()) 
    {
        println!("功能标志状态: {}", flag);
    }
}

这个完整示例演示了:

  1. 使用预分配容量创建KV存储
  2. 基本键值操作
  3. 变体数据类型操作
  4. 批量插入数据
  5. 数据持久化到文件
  6. 从文件加载数据
  7. 遍历和查询存储内容
  8. 类型安全的值获取
  9. 变体类型转换

运行此示例后,您将在当前目录下看到生成的app_data.kv文件,其中包含了所有存储的数据。

回到顶部