Files
blackbird/memdb
qing 26de527a09 feat(memdb×libmemdb): memdb 服务化落地——RPC 服务端 + 构建/测试/部署闭环
- libmemdb: 补全 flush() 惰性 TTL 驱逐;修复 explicit 误用/头文件缺失/
  时间戳碰撞误删;size()/get_db() 前 flush 消除脏读;三处双重哈希查找
  合并;index_keys 去冗余字段;update(refresh_ttl) 改原地重索引,
  免 remove+insert 的拷贝与重复 flush
- memdb: 重写 RPC 服务端(libmsg RpcServer, :8011, 9 路由, mutex 保护);
  补全 Makefile/_set.sh/_run.sh 与 --instance/--log-level CLI;
  SIGINT/SIGTERM 优雅退出;注册 services.yaml
- 测试: libmemdb 单元测试 22 例 + memdb RPC 集成测试 12 场景(含并发)
- 清理: 删除误合入的 db2/create_sqlite3.sql 旧版(scripts/ 下为权威版)
2026-08-15 09:27:12 +08:00
..
2026-08-14 19:39:06 +08:00

memdb — 内存缓存数据库

基于 libmemdb 模板库的 JSON RPC 缓存服务,提供键值存储、TTL 过期、并发安全的内存缓存能力。

架构

Memdb<std::string, std::string>        (libmemdb 模板:LRU 链表 + 哈希索引 + TTL 过期)
    └── MemdbServer                     (RPC 服务端:路由注册 + 互斥锁线程安全)
        └── pmc::net::RpcServer         (libmsg JSON RPC 服务端:多客户端 select + 线程池)

路由

路由 参数 返回 说明
ping — "pong" 健康检查
set key, value true/false 插入键值对(key 已存在返回 false)
get key "value" / null 查询键值
del key true/false 删除键
update key, value, refresh_ttl? true/false 更新值,可选刷新 TTL
exists key true/false 键是否存在
size — int 当前条目数
expire key, value true/false 更新值并重置 TTL(del + set)
show — [{key,value},...] 导出所有条目

配置

ServerConfig 结构体(src/memdb.cpp):

字段 默认值 说明
listen_host 127.0.0.1 监听地址
listen_port 8011 监听端口
workers 4 线程池大小
max_time 600 默认 TTL(秒),10 分钟

构建与运行

前置依赖:g++(C++20)、libmsg、libmemdb、boost::json

# 构建
bash _set.sh

# 运行
bash _run.sh

客户端示例

#include <us/RpcClient.hpp>

pmc::net::RpcClient rpc("127.0.0.1", 8011, "memdb-client");

// 插入
json::object params;
params["key"]   = "session:abc123";
params["value"] = R"({"user":"admin","role":"root"})";
rpc.call("set", params);  // → true

// 查询
rpc.call("get", {{"key", "session:abc123"}});  // → "{\"user\":\"admin\",...}"

// 检查存在
rpc.call("exists", {{"key", "session:abc123"}});  // → true

// 查看大小
rpc.call("size");  // → 1

项目结构

memdb/
├── src/
│   └── memdb.cpp      # MemdbServer + main()
├── Makefile
├── _set.sh
├── _run.sh
└── README.md