java泛型缓存需解决类型擦除问题,核心是将类型信息带入运行时:通过class或typereference显式传参,分层实现caffeinecache、rediscache、doublelevelcache,并借助jetcache注解与typedcacheexecutor保障类型安全。

Java 中设计统一的泛型缓存接口 Cache<k v></k>,核心不是“写一个通用泛型类”,而是建立一套**类型安全、运行时可识别、多级可插拔**的抽象体系。直接用 Cache<string user></string> 这类声明在编译期有效,但到 Redis 序列化/反序列化时,JVM 已擦除泛型信息,V 会变成 Object,导致反序列化失败(如返回 LinkedHashMap 而非 User)。所以统一 API 的关键,在于把类型信息“带进运行时”。
用 TypeReference 或 Class 显式传递类型
避免依赖泛型擦除,所有缓存操作方法都要求显式传入类型参数:
-
get(String key, Class<v> type)</v>:适用于简单类型(String.class、User.class) -
get(String key, TypeReference<v> typeRef)</v>:适用于复杂泛型(new TypeReference<page>>() {}</page>) - 底层序列化器(如 Jackson、Fastjson2)按此类型解析,不靠泛型声明
分层接口 + 统一 Cache 接口契约
定义标准 javax.cache.Cache<k v></k>(JSR-107)作为顶层契约,再按层级提供实现:
-
CaffeineCache<k v></k>:本地缓存,内部持Caffeine<k v></k>,类型由构造时传入的Class<v></v>约束 -
RedisCache<k v></k>:分布式缓存,使用StringRedisTemplate+ 自定义序列化器,每次get都需指定TypeReference -
DoubleLevelCache<k v></k>:组合前两者,对外暴露同一套get/put/evict方法,内部先查本地、再查远程,类型参数透传到底层
借助 JetCache 实现开箱即用的统一注解
不用从零造轮子,JetCache 已解决泛型+多级问题:
- @Cached 注解支持
key="#id"和value="#result",值类型由方法返回签名决定(Spring AOP 可提取) - 自动适配
CacheType.LOCAL/CacheType.REMOTE/CacheType.BOTH,切换只需改配置 - 序列化策略可配(如 fastjson2),支持
Page<user></user>这类嵌套泛型反序列化 - 配合
@CreateCache声明式创建缓存实例,类型信息由 Spring 上下文保留
封装 TypedCacheExecutor 做类型安全执行器
避免 Controller 层反复传类型,封装一个执行器:
- 构造时注入具体缓存实现(如
RedisCache)和目标类型(Page.class、User.class) - 提供
<t> T get(String key)</t>方法,内部调用redisCache.get(key, typeRef) - Controller 中直接写:
Page<user> page = executor.get("user:list:1");</user>,类型推导清晰,无强制转型
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











