java通过定义统一缓存接口解耦redis与caffeine,接口含get/set/delete/exists等中立方法,redis实现侧重序列化与连接管理,caffeine实现忽略过期参数并纯内存查取,支持运行时动态切换与复合缓存策略。

Java 中通过定义统一缓存接口,能有效解耦 Redis 和本地缓存(如 Caffeine)的具体实现,让业务代码不感知底层差异。核心在于抽象出标准操作契约,再由不同实现类分别适配。
定义通用缓存接口
接口应覆盖最常用的操作,且参数与返回值保持中立,避免绑定某一种缓存技术的特性:
- key 类型统一用 String(或 Serializable),避免 Redis 的 byte[] 或 Caffeine 的泛型 Key 冲突
- value 统一用 Object,实际使用时靠序列化/反序列化或泛型包装处理类型安全
- 方法包括:
get(key)、set(key, value, expire)、delete(key)、exists(key) - 可选增加
getOrDefault(key, defaultValue)或putIfAbsent(key, value)等语义明确的方法
Redis 缓存实现类
基于 Spring Data Redis 或 Lettuce/Jedis 封装,重点处理序列化和连接管理:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 使用
StringRedisTemplate或RedisTemplate<string object></string>,配置 Jackson2JsonRedisSerializer 保证对象可读可写 -
set方法调用opsForValue().set(key, value, timeout, unit),显式传入过期时间 -
get方法先判空,再反序列化;若值为 null,返回 null 而非抛异常,与本地缓存行为一致 - 注意 key 命名规范(如加前缀
cache:user:),避免不同业务 key 冲突
本地缓存实现类
以 Caffeine 为例,封装成与 Redis 接口签名完全一致的实现:
- 构造时初始化
Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10, TimeUnit.MINUTES) -
set(key, value, expire)中 ignore expire 参数(或仅用于触发 refresh),因 Caffeine 自身已配置默认过期策略 -
get(key)调用cache.getIfPresent(key),未命中返回 null,不触发加载逻辑(保持旁路模式语义) - 避免在本地缓存里做复杂计算或阻塞 IO,只做纯粹内存查取
运行时动态切换与组合
接口本身不决定用哪一层,而是由上层策略控制:
- 用 Spring 的
@Qualifier或工厂模式注入不同实现,比如@Resource(name = "redisCache") - 复合缓存场景下,可封装一个
CompositeCache实现该接口:读时先查本地,未命中再查 Redis;写时同步更新两级(或仅失效) - 通过配置项(如
cache.type=redis或cache.type=caffeine)控制 Bean 创建逻辑,便于灰度或降级
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










