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
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
@Test
void treeReturnsCachedTreeBeforeQueryingDatabase() {
// arrange cached tree
// call controller.tree(...)
// assert menuService.list(...) is never called
}
Run: mvn -pl rsf-server -Dtest=MenuControllerTest test
Expected: FAIL because MenuController does not use Redis for /menu/tree
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);
}
Run: mvn -pl rsf-server -Dtest=MenuControllerTest test
Expected: PASS
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"