编辑 | blame | 历史 | 原始文档

Menu Tree Redis Cache Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Add Redis caching for /menu/tree without changing the endpoint contract.

Architecture: Cache the full menu tree in Redis behind a single stable key, then apply the existing condition filter in memory on the cached tree result. Evict the cache only after successful menu save, update, and remove operations so reads stay fast and behavior stays aligned with the database.

Tech Stack: Spring Boot, MyBatis-Plus, Jedis-based RedisService, JUnit 5, Mockito


Task 1: Lock behavior with controller tests

Files:
- Create: rsf-server/src/test/java/com/vincent/rsf/server/system/controller/MenuControllerTest.java
- Modify: rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java

  • [ ] Step 1: Write the failing test
@Test
void treeReturnsCachedTreeBeforeQueryingDatabase() {
    // arrange cached tree
    // call controller.tree(...)
    // assert menuService.list(...) is never called
}
  • [ ] Step 2: Run test to verify it fails

Run: mvn -pl rsf-server -Dtest=MenuControllerTest test
Expected: FAIL because MenuController does not use Redis for /menu/tree

  • [ ] Step 3: Write minimal implementation
List<Menu> treeData = redisService.get(MENU_TREE_CACHE_FLAG, MENU_TREE_CACHE_KEY);
if (treeData == null) {
    treeData = loadAndBuildTree();
    redisService.set(MENU_TREE_CACHE_FLAG, MENU_TREE_CACHE_KEY, treeData, MENU_TREE_CACHE_TTL_SECONDS);
}
  • [ ] Step 4: Run test to verify it passes

Run: mvn -pl rsf-server -Dtest=MenuControllerTest test
Expected: PASS

  • [ ] Step 5: Commit
git add docs/superpowers/plans/2026-03-26-menu-tree-redis-cache.md rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java rsf-server/src/test/java/com/vincent/rsf/server/system/controller/MenuControllerTest.java
git commit -m "feat: cache menu tree in redis"