go轻量级内存数据库原型使用map[string][]byte存储、sync.rwmutex保障并发安全,提供set/get/delete/keys接口及简易repl命令行,支持二进制value、无持久化与ttl,代码简洁可扩展。

用 Go 实现一个轻量级内存数据库原型,核心在于利用 map 做键值存储、sync.RWMutex 保障并发安全、加上基础的增删改查(CRUD)接口和简单的命令解析。它不追求功能完备,但要结构清晰、可扩展、线程安全、易于理解。
数据模型与存储结构
最简内存数据库以字符串为 key,任意字节序列为 value(即支持二进制数据),底层用 map[string][]byte 存储。为避免并发读写 panic,所有访问都需加锁:
- 使用
sync.RWMutex:读多写少场景下,允许多个 goroutine 并发读,写操作独占锁 - value 不做序列化约束,上层可自行处理 JSON、Protobuf 等格式
- 不实现过期机制或持久化——若需,可后续叠加 TTL 字段或定期快照到文件
核心操作接口设计
定义统一的操作接口,便于测试和替换实现:
-
Set(key string, value []byte) error:插入或覆盖键值对 -
Get(key string) ([]byte, bool):返回值和是否存在标志(不返回 error,查无结果是正常行为) -
Delete(key string) bool:删除成功返回 true,key 不存在也返回 false -
Keys() []string:返回当前所有 key 的副本(避免暴露内部 map)
所有方法内部自动加锁,调用方无需关心同步细节。
简易命令行交互层
用 fmt.Scanln + 字符串切分模拟 REPL(Read-Eval-Print Loop),支持三条命令:
-
SET key value:value 中空格会被截断,如需支持带空格值,可改用引号包裹或换用bufio.Scanner按行读取 -
GET key:输出 value 的字符串形式(非 UTF-8 安全,仅作演示;生产中建议 hex 或 base64 编码显示) -
DEL key和KEYS:对应删除与列出全部 key
命令解析不做复杂语法树,用 strings.Fields 切分后 switch 匹配首单词即可。
启动与运行示例
主函数实例化数据库,启动交互循环:
db := NewInMemoryDB()
fmt.Println("Simple DB started. Type 'quit' to exit.")
for {
fmt.Print("> ")
var line string
if _, err := fmt.Scanln(&line); err != nil || line == "quit" {
break
}
handleCommand(db, line)
}
每条命令执行后打印简要结果(如 OK、NOT_FOUND 或实际值),保持反馈明确。整个实现通常在 150 行以内,适合教学、原型验证或嵌入工具链中作为临时状态缓存。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











