springboot缓存注解:为 SpringBoot 项目接入基于 Redis 的 @CacheResult

前言

在已有 SpringBoot 服务里加缓存,常见做法是手写 Redis 工具类或在每个查询方法里套一层 get/set。注解式缓存能减少重复代码,但 Spring Cache 与业务约定的 key 规则、null 值语义、SpEL 定制 key 仍要自己对齐实现。下面介绍 SkillHub 社区技能 springboot缓存注解(坐标 @user_faca7523/springboot-cache,版本 1.0.0):通过脚本把 @CacheResult、AOP 切面、Redis 配置和依赖一次性落到项目里,适合在 springboot-init 生成的基础结构上继续扩展。

这是什么

springboot缓存注解 是面向 SpringBoot 的 Agent Skill,发布者为 user_faca7523,分类为 dev-programming,来源为 community。技能目标很明确:为 SpringBoot 项目添加基于 Redis 的缓存注解能力,用 @CacheResult 缓存方法返回值。

该技能声明依赖 springboot-init 技能生成的基础项目结构;单独空仓库若目录与约定不一致,需要先具备对应骨架再执行脚本。

核心功能

@CacheResult 注解参数

参数 类型 默认值 说明
keyPrefix String project:cache 缓存 key 的前缀
key String "" 普通缓存 key
spelKey String "" SpEL 表达式缓存 key
cacheTime int 1 缓存时间
cacheTimeUnit TimeUnit TimeUnit.HOURS 缓存时间单位

Key 生成策略

  1. 优先普通 key:keyPrefix:key
  2. 次优先 SpEL:keyPrefix:解析SpEL表达式
  3. 默认:keyPrefix:类全限定名:方法名:AES(参数)(资料中默认策略描述为对参数做 AES;技术特性一节同时说明使用 Hutool MD5 生成确定性 key,落地时以生成代码为准)

脚本会生成的工程内容

依赖(pom.xml)

  • cn.hutool:hutool-all
  • spring-boot-starter-data-redis
  • spring-boot-starter-aop

application.yml 会补充 Redis 连接项,例如:

spring:
  data:
    redis:
      host: localhost
      port: 6379
      password:
      database: 0
      timeout: 3000ms

新增或更新的 Java 文件

文件路径 说明
annotation/CacheResult.java 缓存注解
common/CacheNullValue.java null 值标记类
util/CacheKeyGenerator.java Key 生成工具类
aspect/CacheResultAspect.java 缓存 AOP 切面
config/RedisConfig.java Redis 配置类

技术特性(官方说明)

  1. 使用 Hutool MD5 工具生成确定性 Key
  2. SpEL 支持 #参数名、#参数.属性 等
  3. 通过 CacheNullValue 区分「未缓存」与「缓存了 null」
  4. 缓存操作失败不影响业务执行
  5. 使用 GenericJackson2JsonRedisSerializer 序列化复杂对象

安装与启用

技能安装后,典型路径为 .trae/skills/springboot-cache/。在具备 springboot-init 结构的项目根目录执行脚本,为指定 artifactId 与包名注入缓存能力:

python .trae/skills/springboot-cache/scripts/cache_annotation.py <artifactId> <packageName> [projectName] [springBootVersion] [author]

示例:

# 基本用法
python .trae/skills/springboot-cache/scripts/cache_annotation.py demo com.example

# 指定项目信息
python .trae/skills/springboot-cache/scripts/cache_annotation.py demo com.example Demo 3.5 wql

参数含义:artifactId、packageName 为必填;projectName、springBootVersion、author 可选。执行前请确认本机 Redis 地址与 application.yml 中配置一致。资料未单独列出 Cursor / Codex CLI / Claude Code 的差异步骤时,以 Skill 目录内脚本与 SKILL.md 为准。

SkillHub 页面显示该技能标签 requires_api_key=false,无需额外 API Key。

典型用法

在 Service 或查询方法上声明 @CacheResult,按 key 策略三选一或组合时间与单位:

// 使用普通 key
@CacheResult(keyPrefix = "user:", key = "info")
public User getUser(Long userId) {
    // ...
}

// 使用 SpEL key
@CacheResult(keyPrefix = "user:", spelKey = "#userId")
public User getUser(Long userId) {
    // ...
}

// 使用默认 key,并设置 30 分钟过期
@CacheResult(cacheTime = 30, cacheTimeUnit = TimeUnit.MINUTES)
public User getUser(Long userId) {
    // ...
}

经过上面的步骤,首次调用会走方法逻辑并写入 Redis;相同 key 在有效期内由切面直接返回缓存。需要穿透或更新缓存时,应在业务层配合过期时间或自行扩展失效逻辑(技能资料未内置 @CacheEvict 类注解,以生成代码能力为界)。

适用场景与注意

适合

  • 已在或计划用 springboot-init 搭好的 SpringBoot 项目,需要快速加上 Redis + 注解缓存
  • 希望统一 key 前缀、支持 SpEL、并处理 null 缓存语义的场景

注意

  1. 前置依赖:必须先有 springboot-init 约定的项目结构,否则脚本目标路径可能对不齐。
  2. 运行环境:需要可用的 Redis;默认 localhost:6379,生产环境应改 host、密码与 database。
  3. 序列化:复杂对象依赖 Jackson JSON 序列化,类型变更可能导致旧缓存反序列化失败,改模型后宜清 key 或缩短 TTL。
  4. 失败策略:缓存异常不阻断业务,但可能造成短时击穿到数据库,需结合监控观察 Redis 可用性。

结尾

springboot缓存注解 把 Redis 依赖、配置、@CacheResult 切面与 key 策略封装成可脚本化的一步接入,适合在标准 SpringBoot 骨架上补缓存层。更多说明与安装见 SkillHub:

  • API 文档:https://api.skillhub.cn/user_faca7523/springboot-cache
  • 技能页面:https://www.skillhub.cn/skills/user_faca7523/springboot-cache
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye