simplekv键值存储库完全指南:10分钟上手Cangjie高性能KV数据库,一文掌握核心特性
【免费下载链接】simplekvsimplekv是一个用Cangjie语言实现的高效、简洁的键值存储库,支持快速的数据查找、插入、删除,并具备排序数据获取、范围扫描、并发安全等高级功能,适用于需要高性能数据存储的场景。项目地址: https://gitcode.com/Cangjie-SIG/simplekv
simplekv是一个用Cangjie 语言实现的键值存储库(KV 数据库),支持快速的数据查找、插入、删除,并具备按键排序、范围扫描、前缀查询、并发安全等高级功能。代码库短小精悍(核心源码仅约 2000 行),却提供了媲美哈希表的读写性能,非常适合中小型存储场景的新手快速上手。
本文是一份面向初学者的完整指南,读完 10 分钟,你就能在项目中用起来它 🔥
一、simplekv 键值存储库有哪些核心特性?
先花 30 秒认识这个库。它基于 Cangjie 标准库和自定义的random_access_file_cj模块实现,主要特性如下:
| 特性 | 说明 |
|---|---|
| ⚡高性能 | 查找、插入和删除性能媲美哈希表 |
| 📊多功能 | 支持按键值排序、范围扫描、前缀通配符查询 |
| 🪶轻量级 | 短小精悍的代码库,易于理解和维护 |
| 🔒并发安全 | 内置读写锁,可在多协程环境中安全使用 |
| 💾灵活存储 | 支持磁盘持久化、内存优先、纯内存三种存储模式 |
完整特性介绍见 README.md,设计理念与模块职责见 doc/design.md。
二、安装 simplekv:一键获取与编译构建
1. 前置条件
- 已安装 Cangjie 语言工具链(cjc 1.1.0 及以上,版本要求见 cjpm.toml)
- 已安装 Cangjie 包管理工具
cjpm
2. 获取源码并构建
git clone https://gitcode.com/Cangjie-SIG/simplekv cd simplekv cjpm update cjpm build两条cjpm命令即可完成依赖更新与静态库构建,无任何其他配置,这也是它"轻量级"的体现。
3. 项目目录结构速览
. ├── doc/ # 文档目录 │ ├── design.md # 设计文档 │ └── feature_api.md # 特性接口文档 ├── src/ # 源码目录 │ ├── simple_kv_cmd.cj # 命令类,代表一个键值对的存储信息 │ ├── simple_kv_config.cj # 配置类,用于配置数据库参数 │ ├── simple_kv_db.cj # 数据库类,代表一个数据库实例 │ ├── simple_kv_manager.cj # 管理类,用于管理数据库 │ └── simple_kv_util.cj # 工具类 └── src/test/ # 测试代码目录 ├── simple_kv_base_test.cj └── simple_kv_benchmark_test.cj三、快速上手:打开数据库并完成第一次读写
simplekv 的入口是全局单例SimpleKVManager.default,打开数据库只需一行(实现见 src/simple_kv_manager.cj):
let F: String = "./testDir/testDb.db" let db = SimpleKVManager.default.open(F, None) // None 表示使用默认配置1. 配置和打开数据库
通过SimpleKVConfig可以自定义文件权限、同步间隔和存储模式(配置项说明见 src/simple_kv_config.cj):
let config = SimpleKVConfig() config.fileMode = "0777" // 文件权限 config.dirMode = "0777" // 目录权限 config.storeMode = StoreMode.DISK // DISK 磁盘 / MEMORY 内存 let db = SimpleKVManager.default.open(F, config)💡
storeMode有三种取值:文件优先(DISK)、内存优先(持久化)、纯内存(不持久化),按需选择即可。
2. 设置和获取键值(set / get)
写入与读取都极其简单,set写入一条记录,getBool、getString、getInt64等按类型读取:
db.set(1, true) // 写入键值对 let v = db.getBool(1) // 按键读取 Bool 值 println(v) // 输出:true此外还支持getFloat64、getOther(读 JSON 等结构化数据)、getByteArray、getSerializable(自定义类型)以及批量接口sets/getsString等,完整清单见 doc/feature_api.md。
四、进阶玩法:排序获取、范围扫描与前缀查询
simplekv 不止能"存和取",它还能对键进行排序检索,这是普通哈希表做不到的:
// 插入键 "01"~"22" for (i in 22..0: -1) { let k: String = i.format("02") db.set<String, String>(k, "Val:" + i.toString()) } let res = db.keys<String>(None, 0, 0, true) // 全部键升序:010203...22 let resFrom = db.keys<String>("10", 2, 2, false) // 从"10"开始降序取2个:0706 let resPre = db.keys<String>("2*", 4, 0, false) // 前缀通配符 "2*" 查询keys方法支持四个参数:起始键 from(支持*通配符)、限制条数 limit、偏移 offset、升/降序 asc,非常适合实现分页列表、按区间扫描等常见需求。核心逻辑见 src/simple_kv_db.cj。
五、实用功能:计数器与并发安全
1. 计数器(counter)
一行代码实现自动递增,天然适合帖子计数、访问统计等场景:
let key = "postcounter" var counter = db.counter<String>(key, 1) // 每次 +1,返回递增后的值2. 多协程并发读写
simplekv 内部使用ReentrantReadWriteMutex读写锁保护所有共享状态,多协程同时读写无需额外加锁:
spawn { => // 异步写入 db.set<String, String>("Key:1", "Val:1") } let fut = spawn { => // 异步读取 let b = db.getString("Key:1") } fut.get()完整并发示例可参考 src/test/simple_kv_base_test.cj,性能基准测试见 src/test/simple_kv_benchmark_test.cj。
六、架构揭秘:5 个模块如何协作?
想要深入理解 simplekv,只需看懂 5 个类(职责说明详见 doc/design.md 的"架构图"章节):
| 模块 | 文件 | 职责 |
|---|---|---|
SimpleKVManager | src/simple_kv_manager.cj | 对外统一入口,管理多个数据库实例的开、关、删、备份 |
SimpleKVDb | src/simple_kv_db.cj | 核心数据库类,负责键值读写、索引加载与定时同步 |
SimpleKVCmd | src/simple_kv_cmd.cj | 命令/元数据结构,记录数据在文件中的偏移量与大小 |
SimpleKVConfig | src/simple_kv_config.cj | 配置类:文件权限、同步间隔、存储模式 |
SimpleKVUtil | src/simple_kv_util.cj | 工具类:字节与数据类型互转、ByteBuffer 读写 |
一句话总结其设计:SimpleKVManager是门面,SimpleKVDb通过随机读写文件(键文件xx.db.idx+ 值文件xx.db)实现持久化,SimpleKVCmd充当"索引卡片"指向数据位置,SimpleKVUtil负责底层字节转换——层次清晰、各司其职。
七、适用场景与总结
推荐场景:应用本地缓存、轻量配置存储、帖子计数器、按键排序的分页列表、中小规模离线数据。
为什么选 simplekv?
- ✅上手快:
open → set → get三步完成首次读写 - ✅够灵活:磁盘/内存多模式,支持通配符前缀查询
- ✅够安全:多协程环境开箱即用,无需手写同步
- ✅够简单:源码总量小,新人也能快速读懂全貌
🎯 现在就git clone下来,跑通第三节的示例,10 分钟后你就会拥有一个属于自己的高性能 KV 数据库!
📚 延伸阅读:
- 设计文档:doc/design.md
- API 接口文档:doc/feature_api.md
- 基础测试用例:src/test/simple_kv_base_test.cj
【免费下载链接】simplekvsimplekv是一个用Cangjie语言实现的高效、简洁的键值存储库,支持快速的数据查找、插入、删除,并具备排序数据获取、范围扫描、并发安全等高级功能,适用于需要高性能数据存储的场景。项目地址: https://gitcode.com/Cangjie-SIG/simplekv
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考