乐于分享
好东西不私藏

我用 AI 写了一个 Redis 桌面工具,从 0 到 v0.3 只花了一天

我用 AI 写了一个 Redis 桌面工具,从 0 到 v0.3 只花了一天

先说结论

这篇文章讲两件事:

  1. 1. 我做了什么:一个叫 Seven Redis Nav 的 macOS 原生 Redis 可视化管理工具,现在已经开源
  2. 2. 我怎么做的:用 AI 辅助开发,配合一套叫 OpenSpec 的工作流,从零到功能完整只花了一天

如果你是 Redis 用户,可以直接去 GitHub 下载用;如果你对”AI 怎么帮我写代码”更感兴趣,这篇文章的后半段是重点。


一、这个工具是什么

Seven Redis Nav 是一款基于 Tauri 2 + Vue 3 + Rust 构建的 macOS 原生 Redis 可视化管理工具。

先上功能清单:

功能模块
说明
🔌 多连接管理
保存多个 Redis 连接,密码走 macOS Keychain 安全存储
🔐 SSH 隧道
通过跳板机连接内网 Redis,支持密码和私钥认证
🔒 TLS 加密
支持 TLS/SSL,可配置 CA 证书、客户端证书
🗂️ Key 浏览器
String / Hash / List / Set / ZSet / Stream 查看与编辑
💻 CLI 终端
内置命令行,支持历史记录与自动补全
📊 实时监控
MONITOR 命令实时流式展示服务器命令流
📡 Pub/Sub
可视化订阅频道,实时接收消息,支持发布
🐢 慢日志
查看 SLOWLOG,快速定位慢查询
⚙️ 服务器配置
在线查看与修改 Redis CONFIG
🧠 JSON 智能识别
String 类型自动探测 JSON,切换 CodeMirror 编辑器
🔢 二进制三视图
Hex / Base64 / 文本 三种视图切换

技术栈

  • • 桌面框架:Tauri 2
  • • 前端:Vue 3 + TypeScript + TDesign Vue Next
  • • 后端:Rust(redis-rs + tokio 异步)
  • • 存储:SQLite + macOS Keychain
  • • 测试:Vitest + Playwright

为什么选 Tauri 而不是 Electron?包体积。Tauri 打出来的 .dmg 比 Electron 小 10 倍以上,而且用的是系统原生 WebView,内存占用也更低。


二、开发过程:4 个阶段,1 天完成

这是最有意思的部分。

整个项目我用了一套叫 OpenSpec 的 AI 辅助开发工作流,把开发过程拆成了 4 个 Phase,每个 Phase 都有明确的目标和交付物。

Phase 0:工程脚手架(”让它能跑起来”)

目标只有一句话:克隆仓库后,5 分钟内能启动应用,点一个按钮,对真实 Redis 发出 PING 并收到 PONG。

这个阶段不交付任何用户可见的业务功能,只建立工程基线:

  • • Tauri 2 + Rust 后端骨架(commands / services / models / utils 四层)
  • • Vue 3 + TypeScript strict + Vite 前端骨架
  • • 应用主窗口外壳(Titlebar / Toolbar / Sidebar / KeyPanel / Workspace / Statusbar 六大区域)
  • • 端到端 IPC 闭环:connection_test(host, port, password?) → PingResult
  • • 工程化基线:ESLint + Prettier + cargo clippy + Conventional Commits + GitHub Actions CI

为什么要单独做 Phase 0?

因为如果工程基线没打好,后续每个特性都要踩重复的坑。Phase 0 结束后,所有后续 Phase 都可以基于同一套 IPC 契约、错误模型、目录结构平行展开。

Phase 1:MVP(”让它能用”)

目标:实现连接持久化、键浏览、5 种数据类型查看、CRUD 操作和 CLI 终端,达到 v0.1 可用状态。

这一阶段的核心挑战是连接管理

  • • 连接配置存 SQLite,密码存 macOS Keychain(不能明文存!)
  • • 建立 ConnectionMultiplexer 连接池,支持 DB 切换
  • • SCAN 分页游标管理,支持 pattern 搜索和类型筛选
  • • 5 种数据类型查看器(String / Hash / List / Set / ZSet)
  • • CLI 终端:命令历史 + RESP 输出着色 + 危险命令二次确认

一个有意思的细节:虚拟滚动。当 Redis 里有 10 万+ Key 时,普通列表渲染会直接卡死。我用了 @tanstack/vue-virtual 做虚拟滚动,只渲染可视区域内的 Key,滚动依然丝滑。

Phase 2:功能完善(”让它好用”)

目标:把 Toolbar 里那些”占位”的 Tab 全部实现,对应 v0.2。

  • • Pub/Sub 工作区:实时消息流,支持 pattern 订阅,消息过滤/暂停
  • • Slowlog 工作区:SLOWLOG GET 数据表格展示,按耗时排序,支持 RESET
  • • Monitor 工作区:MONITOR 命令实时流,命令着色(读/写/管理),性能保护(缓冲区上限)
  • • Server Config 工作区:CONFIG GET/SET,分组展示,INFO 概览面板
  • • SSH 隧道 + TLS 加密:这两个是这个阶段最复杂的部分

SSH 隧道的实现用了 ssh2-rs,TLS 用了 native-tls。难点在于:SSH 隧道需要在本地起一个端口转发,然后 Redis 客户端连本地端口,整个过程要在 Rust 异步运行时里正确管理生命周期。

Phase 3:扩展类型(”让它专业”)

目标:支持 Stream / Bitmap / HyperLogLog 等非典型数据结构,以及 JSON 智能识别,对应 v0.3。

这一阶段最有意思的是 JSON 智能识别

当你查看一个 String 类型的 Key,如果它的值是合法 JSON,应用会自动切换到 CodeMirror 6 JSON 编辑器,带语法高亮、代码折叠、搜索和美化/压缩按钮。如果不是 JSON,就回退到纯文本。

二进制三视图也很实用:当 String / Hash 字段 / List 元素内容探测为二进制时,提供 Hex / Base64 / 文本 三个切换视图。


三、OpenSpec 工作流:AI 辅助开发的方法论

说完做了什么,来说说怎么做的

这套工作流的核心思想是:把”想清楚”和”写代码”分开

工作流的四个步骤

Explore(探索)→ Propose(提案)→ Apply(实施)→ Archive(归档)

1. Explore(探索)

在动手写代码之前,先和 AI 一起把问题想清楚:

  • • 这个功能要解决什么问题?
  • • 有哪些技术方案?各自的 trade-off 是什么?
  • • 有哪些风险?

这一步的产出是一份思路文档,不是代码。

2. Propose(提案)

基于探索结果,生成一份完整的变更提案,包含:

  • • proposal.md:Why / What Changes / Capabilities / Impact
  • • design.md:技术决策(Decisions)、风险(Risks)、迁移计划(Migration Plan)
  • • tasks.md:拆分成具体的实施任务,每个任务有明确的验收标准

3. Apply(实施)

按照 tasks.md 逐一实施,AI 帮你写代码,你负责 review 和调试。

关键点:每个任务都有明确的验收标准,不是”写完就行”,而是”写完后跑测试,覆盖率 ≥ 70%”。

4. Archive(归档)

Phase 完成后,把所有文档归档到 openspec/changes/archive/ 目录,形成项目的”决策日志”。

为什么这套流程有效?

传统的 AI 辅助开发有一个常见问题:AI 生成的代码质量参差不齐,而且很难维护

根本原因是:AI 不知道你的项目上下文,不知道你的技术决策,不知道你的代码规范。

OpenSpec 的解法是:把上下文显式化

每个 Phase 的 design.md 里都有明确的技术决策(D1、D2、D3…),每个决策都有理由和替代方案。这样 AI 在生成代码时,就有了足够的上下文,不会乱来。

举个例子,Phase 4 的 D2 是这样写的:

D2:多 Tab CLI 的会话管理策略

决策:每个 CLI Tab 持有独立的 Redis 连接,通过 HashMap<TabId, CliSession> 管理。

理由:CLI 可能执行阻塞命令(如 SUBSCRIBEBLPOP),独立连接避免阻塞其他 Tab。

替代方案:共享连接 + 命令队列,但实现复杂且无法支持阻塞命令。

有了这份文档,AI 生成的代码就不会用错误的方案,也不会在 review 时让你困惑”为什么这么写”。


四、一些有意思的技术细节

macOS Keychain 集成

密码不能明文存 SQLite,这是基本的安全常识。

我用了 security-framework crate 把密码存到 macOS Keychain。有一个坑:Keychain 在某些情况下会弹出两次授权弹窗(一次读、一次写),用户体验很差。

解决方案是:在 Tauri 的 capabilities 配置里正确声明权限,并且在 Rust 侧用 SecKeychainItem 的 update 方法替代先删后写,避免触发两次授权。

MONITOR 命令的背压控制

MONITOR 命令会把 Redis 服务器上的所有命令实时推送给客户端,在高 QPS 场景下,推送速度可能超过前端渲染速度。

解决方案:

  • • 后端设置缓冲区上限(默认 10000 条),超出后丢弃旧消息
  • • 前端用 requestAnimationFrame 批量渲染,避免每条消息都触发 DOM 更新
  • • 提供”暂停”按钮,暂停时后端停止推送

虚拟滚动 + SCAN 游标

Key 浏览器的实现是两层懒加载:

  1. 1. SCAN 游标:Redis 的 SCAN 命令每次返回一批 Key(默认 100 个),通过游标分页
  2. 2. 虚拟滚动:前端只渲染可视区域内的 Key,滚动到底部时触发下一次 SCAN

这两层配合,可以流畅浏览百万级 Key 的 Redis 实例。


五、下一步:v0.4 规划

Phase 4(v0.4)正在开发中,主要新增:

  • • Lua 脚本编辑器:CodeMirror 6 + Lua 语法高亮,支持 EVAL/EVALSHA 执行
  • • 大 Key 扫描器:后台异步任务,SCAN + MEMORY USAGE 抽样,生成 Top 100 大 Key 报告
  • • 健康检查报告:综合 INFO / SLOWLOG / Keyspace 数据,生成可导出的 Markdown 健康报告
  • • 多 Tab CLI:⌘T 新开 CLI 标签页,每个 Tab 独立连接与历史
  • • 数据导入导出:JSON 格式导出/导入,只读解析 RDB 文件
  • • 数据脱敏:配置 key pattern → 掩码规则,Browser Workspace 实时生效

六、开源地址

项目已在 GitHub 开源,MIT 协议:

GitHubgithub.com/qwzhang01/seven-redis-nav

欢迎 Star、提 Issue、提 PR。

如果你在用 Redis,试试看,有问题直接在公众号留言找我。