function 接口通过封装“查缓存→未命中则加载→写回缓存”逻辑,提升 cache-aside 模式代码复用性与类型安全性,并支持延迟加载、空值防穿透等定制策略,是 spring cache 注解的轻量级编程式补充。

Java 中 Function 接口本身不直接参与 Cache-Aside 模式,但它能显著简化该模式中“查缓存→未命中则加载→写回缓存”这一通用流程的代码结构,提升可读性与复用性。
用 Function 封装“加载并缓存”逻辑
Cache-Aside 的核心读取逻辑具有固定骨架:先尝试从 Redis 获取值;若为空,则调用业务方法加载数据,并将结果写入缓存。这段模板代码重复出现在多个服务中。Function 可将其抽象为一个可复用的高阶操作。
例如:
- 定义一个通用方法:
<t> T getOrLoad(String key, Class<t> type, Function<string t> loader, long ttl)</string></t></t> -
loader参数就是实际从数据库加载数据的函数,比如id -> productRepository.findById(Long.valueOf(id)).orElse(null) - 方法内部统一处理缓存读取、空值判断、DB 加载、缓存写入(含 TTL)
避免手动拼接缓存键与类型转换
原生 RedisTemplate 的 get() 返回 Object,需强制转型;而 Function 配合泛型可自然约束输入输出类型,配合 Jackson 或 Fastjson 的反序列化封装,让调用方无需关心底层字节/字符串转换细节。
示例中 loader 的输入是 key 字符串(如 "product:123"),输出是目标对象(Product),整个链路类型安全,编译期即可捕获错误。
支持延迟加载与条件缓存
借助 Function 的惰性特性,可以实现“仅在缓存未命中时才触发 DB 查询”。它天然契合 Cache-Aside 的按需加载语义,比提前执行查询再判断缓存更高效。
还可结合 Optional 或自定义空值策略扩展:比如 loader 返回 null 时,自动写入空对象缓存(防穿透),这些增强逻辑均可在通用方法内统一控制,无需每个 service 重复实现。
与 Spring Cache 注解互补,不替代
Function 是编程式缓存的轻量工具,适合需要精细控制缓存行为的场景(如动态 TTL、多级缓存、异常降级)。它不取代 @Cacheable 这类声明式方案,而是为其提供底层支撑——Spring Cache 底层同样大量使用函数式接口封装加载逻辑。
在复杂业务中,常混合使用:简单场景用注解,需定制加载策略或组合多个缓存源时,用 Function 显式编写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











