MyNoSQL 是一个用于课程设计的 C/S 架构 NoSQL 数据库。服务端使用线程池同时处理多个客户端,提供 Collection、CRUD、批量操作、多类型 value、快照持久化、LRU 缓存、等值索引、WAL 崩溃恢复、文件归档压缩和 1 Master + 2 Slave 静态集群。
运行时只依赖 JDK,不使用第三方库。推荐 JDK 21,编译目标为 Java 17。
最简单的方式是双击 双击启动.bat,它会自动构建、启动单机 Server 并打开 GUI。关闭 GUI 后,脚本会执行 checkpoint 并停止本次启动的 Server。
也可以手动打开两个 PowerShell 窗口:
# 窗口 1
.\build.ps1
.\run-server.ps1
# 窗口 2:GUI 或 CLI 二选一,也可以同时打开
.\run-gui.ps1
.\run-cli.ps1首次完整构建会同时运行单机和三节点集群验收测试。成功标志:
ACCEPTANCE_SMOKE_TEST_PASSED
CLUSTER_ACCEPTANCE_TEST_PASSED
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10/11 |
| JDK | 17 或更高,当前机器已用 JDK 21 验证 |
| Maven | 可选;本项目提供纯 JDK 构建脚本 |
| 默认端口 | 9527 |
| 第三方运行库 | 无 |
检查环境:
java -version
javac -version| 文件 | 用途 |
|---|---|
build.ps1 |
编译、打 Jar、运行单机和集群验收测试 |
run-server.ps1 |
启动单机 Server,按 Ctrl+C 正常停止 |
run-gui.ps1 |
启动 Swing 管理控制台 |
run-cli.ps1 |
启动交互式 CLI、执行单条命令或脚本 |
start-all.ps1 |
一键启动 Server + GUI |
start-cluster.ps1 |
启动 1 Master + 2 Slave |
stop-cluster.ps1 |
checkpoint 后停止三节点集群 |
reset-demo-data.ps1 |
备份并重置演示数据 |
执行命令脚本:
.\run-server.ps1
# 另一个窗口
.\run-cli.ps1 -Script examples\demo.mql执行单条命令:
.\run-cli.ps1 -Command "info"| 指导书要求 | 实现位置 | 验证方式 |
|---|---|---|
| Java、C/S、多客户端并发 | Server、ClientHandler |
同时打开 GUI 和 CLI |
| KV 增删改查 | CommandExecutor、StorageManager |
put/get/update/delete |
| 数值、字符串、Set、Map | ValueWrapper、SimpleJson |
GUI 类型选择或 putTyped/putS/putM |
| Collection | Collection、StorageManager |
GUI 左侧集合或 createCollection/use |
| 批量操作 | CommandExecutor |
GUI“更多 -> 批量操作” |
| 磁盘持久化 | FileManager |
save,重启后查询 |
| Rotate + GZIP + 独立线程 | FileManager |
GUI“归档压缩”或 rotate |
| 缓存及一致性 | LRUCache、StorageManager |
重复 get 后执行 cacheStats |
| 等值索引 | IndexManager |
createIndex value、findByIndex value 20 |
| WAL 崩溃恢复 | WALManager、StorageManager |
AcceptanceSmokeTest 强制终止并重启 |
| CLI / Shell / Java API | Client、MyNoSQLClient |
CLI、demo.mql、Jar 调用 |
| REST 风格 Socket | RestDispatcher |
REST GET /collections/default/name |
| GUI | DatabaseGUI |
数据、命令、运行状态三个页签 |
| 1 主 2 从静态集群 | ReplicationManager、cluster-demo.conf |
start-cluster.ps1 |
| 测试和性能 | src/test |
build.ps1、PerformanceBenchmark |
个人组指导书中标为选做的 LSMT 存储结构和动态选举没有实现;当前集群采用静态配置,符合个人组完成范围。
# CRUD 与浏览
put <key> <value>
putTyped <key> <STRING|INTEGER|LONG|DOUBLE|BOOLEAN|LIST|SET|MAP> <value>
get <key>
update <key> <value>
delete <key>
keys
scan
exists <key>
# Collection
createCollection <name>
dropCollection <name>
use <name>
showCollections
# 批量与复杂值
batchPut <k1> <v1> <k2> <v2> ...
batchUpdate <k1> <v1> <k2> <v2> ...
batchDelete <k1> <k2> ...
putL <key> <element>
putS <key> <element>
putM <key> <mapKey> <mapValue>
# 索引、缓存、持久化
createIndex value
findByIndex value <value>
dropIndex value
listIndexes
cacheStats
clearCache
save
checkpoint
rotate
info
help
REST 风格 Socket 示例:
REST PUT /collections/default/name ZhangSan
REST GET /collections/default/name
REST PATCH /collections/default/name LiSi
REST DELETE /collections/default/name
.\start-cluster.ps1
# 写 Master
.\run-cli.ps1 -Port 9527
# 读 Slave,普通客户端不能直接写 Slave
.\run-cli.ps1 -Port 9528
.\stop-cluster.ps1角色和地址在 config/cluster-demo.conf 中静态配置。Master 异步复制写命令,单线程复制执行器保证命令提交顺序;每条复制消息携带 Collection 上下文,防止非 default 数据写错集合。
- 单机脚本默认使用
demo-data/standalone,不会修改仓库原有data/。 - 集群使用
cluster-data/master、cluster-data/slave1、cluster-data/slave2。 save写入完整二进制快照。checkpoint先原子保存快照,再清空 WAL。- WAL 恢复顺序为“先加载快照,再回放 WAL”。
- WAL V2 使用 Base64 保存用户字段并记录 value 类型,可恢复 List、Set、Map。
rotate保留当前快照,并生成.gz归档。
可通过系统属性覆盖数据目录和自动 Rotate 阈值:
java -Dmynosql.data.dir=my-data -Dmynosql.rotate.threshold=1048576 `
-jar dist\MyNoSQL-1.0.0.jarsrc/main/java/com/mynosql/
server/ ServerSocket、线程池、每连接处理器
command/ 命令解析、执行、注解、REST 调度
storage/ Collection、KVEngine、快照与统一协调
common/ 类型封装、JSON、协议、配置、存储接口
cache/ LRU 缓存
index/ Collection 内独立等值索引
wal/ 预写日志与崩溃恢复
cluster/ 静态配置与主从复制
client/ CLI、Shell、Java API
gui/ Swing 管理控制台
主要面向对象设计:
Storage接口和AbstractStorage模板方法体现抽象、继承与多态。Collection组合KVEngine,体现组合复用。StorageManager是单例和统一协调入口。CommandType + CommandParser + CommandExecutor负责命令对象创建与分发。@CommandInfo在运行时由反射读取,自动生成帮助。MyNoSQLClient封装 Socket,提供可复用 Java API。
# 全量构建 + 独立验收
.\build.ps1
# 性能测试,默认 100000 次写和读
java -cp "out-test;out" com.mynosql.PerformanceBenchmark
# 如果电脑安装了 Maven,还可运行 JUnit 5
mvn test独立验收覆盖 CRUD、类型、Collection 会话隔离、索引更新、REST、Rotate、checkpoint 后崩溃恢复、三节点复制和 Slave 只读限制。
javac找不到:安装 JDK 17+,不能只安装 JRE。- 端口 9527 被占用:关闭旧 Server,或运行
.\run-server.ps1 -Port 9627。 - GUI 显示未连接:先启动 Server,再点击右上角“连接”。
- 演示数据重复:运行
.\reset-demo-data.ps1,原数据会先备份到backups/。 - 退出 Server:在 Server 窗口按
Ctrl+C,关闭钩子会保存快照并标记正常退出。
验收顺序和答辩材料见 docs/验收演示手册.md、docs/答辩要点.md 和 docs/技术栈速成.md。