Skip to content
XYL333FYQPublic

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

English | 中文

MyNoSQL - Java 轻量级键值数据库

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.jar

代码结构

src/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。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages