fitten code 可自动生成含空值防护、逻辑过期、json序列化等能力的 redis 工具类:①普通ttl缓存写入;②逻辑过期写入;③空值缓存读取防穿透;④逻辑过期读取防击穿,需校验redisdata结构、json工具替换及空字符串判空。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要快速生成一个能应对缓存穿透、击穿、雪崩等常见问题的 Redis 操作封装类,又不想从零手写重复逻辑——Fitten Code 可以基于自然语言指令,自动生成结构清晰、含 JSON 序列化、空值防护、逻辑过期等关键能力的 Java 工具类。
准备 Fitten Code 环境并触发生成
打开 Fitten Code 插件(VS Code 或 JetBrains IDE),确保已登录并接入最新模型版本(v2.4+)。
在空白文件中输入指令:“生成一个 Spring Boot 下的 Redis 缓存工具类,使用 StringRedisTemplate,支持四种能力:①普通带 TTL 的 JSON 缓存写入;②带逻辑过期时间的缓存写入(用于防击穿);③带空值缓存的读取(防穿透);④带逻辑过期校验的读取(防击穿)。要求注入 StringRedisTemplate,用 @Component 声明,含 Lombok @Slf4j。”
按下 Ctrl+Enter(或点击“生成”按钮),等待代码块输出。生成内容应包含完整类定义、四个核心方法及必要依赖导入。
检查并修正关键字段与序列化逻辑
确认生成类中是否定义了内部数据结构 RedisData,且含 data 和 expireTime 两个字段——这是逻辑过期方案的基石,缺一不可。
检查 setWithLogicalExpire 方法内是否先构造 RedisData 实例,再调用 JSONUtil.toJsonStr() 序列化;若使用 Jackson,需确保 ObjectMapper 配置允许序列化 LocalDateTime。
【必须替换 JSONUtil 为项目实际使用的 JSON 工具】 若项目用 Jackson,将 JSONUtil.toJsonStr() 替换为 objectMapper.writeValueAsString(),并将 JSONUtil.toBean(json, type) 替换为 objectMapper.readValue(json, type);否则运行时会报 NoClassDefFoundError。
验证 queryWithPassThrough 方法中空值判断是否为 if (json == null || "".equals(json)),而非仅 if (json == null)——漏判空字符串会导致穿透防护失效。
配置并注入 StringRedisTemplate Bean
打开 application.yml,确认已声明 Redis 连接参数:
spring:
redis:
host: localhost
port: 6379
database: 0
timeout: 2000
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
若项目启用连接池,需额外添加 lettuce 配置段;未配置则 Fitten Code 生成的类仍可运行,但高并发下可能抛出连接耗尽异常。
检查 CacheClient 类构造器是否为 public CacheClient(StringRedisTemplate stringRedisTemplate),且类上标注 @Component——这是 Spring 容器自动注入的前提。
编写测试用例验证四类场景
第一步:新建测试类 CacheClientTest,@RunWith(SpringRunner.class) + @SpringBootTest。
第二步:注入 CacheClient 实例和 StringRedisTemplate 实例。
第三步:分别执行以下断言链:
① set → get → 验证值一致且非 null;
② setWithLogicalExpire → 等待超逻辑时间 → queryWithLogicalExpire → 验证返回 null(触发回源);
③ 直接 put 空值字符串 "" 到某 key → queryWithPassThrough → 验证返回 null 且不查 DB;
④ 删除该 key → 再次 queryWithPassThrough → 验证 DB 查询函数被调用一次,且结果写入缓存。
注意:queryWithPassThrough 中的 dbFallback 函数必须是 Mockito.mock() 生成的模拟对象,并 verify 调用次数——否则无法证明空值缓存生效。










