阿里开源的 JetCache-Alibaba 缓存框架,来了解一下?

阿里开源的 JetCache-Alibaba 缓存框架,来了解一下?
最新回答
揉揉肚子

2022-04-01 10:04:30

JetCache-Alibaba 是阿里巴巴开源的基于 Spring 和 Redis 的分布式缓存框架,支持多级缓存、多种缓存协议及高性能场景,适用于中小型应厅册用开发。 以下是详细介绍:

一、核心特点
  • 基于注解通过 @Cached、@CacheUpdate、@CacheInvalidate 等注解实现缓存配置与操作,代码简洁且易于维护。例如,使用 @Cached(name="cacheName", key="#id", expire=3600) 可直接定义缓存名称、键生成规则及过期时间。

  • 多级缓存支持支扮烂宏持本地内存(Memory)、Redis、Tair、Memcached 等存储类型,可配置为单级或多级缓存(如 LOCAL+REMOTE)。多级缓存通过本地内存减少远程访问,提升命中率并降低延迟。

  • 多种缓存协议兼容支持 Redis、Tair、Memcached 等协议,可通过配置灵活切换存储后端,适应不同业务需求。

  • 高性能优化针对分布式高并发场景优化数据结构与查询算法,例如使用一致性哈希减少缓存雪崩风险,支持批量操作降低网络开销。

  • 易用性与扩展性提供简单的 API(如 CacheBuilder 创建缓存、Cache 对象操作数据),支持 Spring 注入与自定义配置。通过扩展接口可实现自定义缓存策略或存储适配器。

图:JetCache 多级缓存结构(本地+远程)二、典型应用场景
  • 热点数据缓存将频繁访问的数据(如商品详情、用户信息)缓存在本地或 Redis 中,减少数据库压力。例如,电商平台的商品详情页通过 @Cached 缓存数据,TTL 设置为 5 分钟。

  • 高并发读写优化在秒杀、抢购等场景中,通过本地缓存(LOCAL)吸收瞬时流量,避免直接冲击 Redis 或数据库。例如,使用 @Cached(cacheType=LOCAL) 缓存库存数据,配合异步更新远程缓存。

  • 多级缓存融合结合本地缓存(低延迟)与远程缓存(持久化),平衡性能与可靠性。例如,配置 cacheType=BOTH 时,数据先写入本地内存,再异步同步到 Redis。

  • 高速查询加速对复杂查询结果(如聚合数据)进行缓存,显著提升响应速度。例如,通过 @CreateCache 创建查询缓存,设置 expire=300 定期刷新。

三、API 与核心功能
  • 缓存管理

    CacheBuilder:创建缓存实例,支持配置存储类型、过期策略等。

    Cache 接口:提供 get(key)、put(key, value)、remove(key) 等基础操作。

  • 注解驱动

    @Cached:定义缓存规则,支持 name(缓存名称)、key(SPEL 表达式生成键)、expire(过期时间)、历郑cacheType(存储类型)等属性。

    @CacheUpdate:更新缓存内容,通常与数据库更新操作同步。

    @CacheInvalidate:删除缓存,常用于数据删除或批量更新场景。

  • 存储类型配置

    本地缓存:基于 Caffeine 或 LinkedHashMap 实现,适合存储热点数据。

    远程缓存:支持 Redis(单机/集群)、Tair、Memcached,通过 jetcache.remote 配置连接参数。

    两级缓存:通过 cacheType=BOTH 启用,数据同时写入本地与远程存储。

四、SpringBoot 整合步骤
  1. 添加依赖在 pom.xml 中引入 JetCache Starter:

    <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis</artifactId> <version>3.0.1</version></dependency>
  2. 配置 YAML 文件配置远程 Redis 与本地缓存参数:

    jetcache: remote: type: redis default: servers: 127.0.0.1:6379 database: 0 password: timeout: 5000 local: default: limit: 10000
  3. 启用缓存注解在启动类上添加 @EnableMethodCache,指定扫描包路径:

    @SpringBootApplication@EnableMethodCache(basePackages = "com.example.service")public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
  4. 业务代码示例使用注解实现缓存操作:

    @Servicepublic class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; // 查询缓存:TTL=300秒,存储类型为两级缓存 @Cached(name = "userCache", key = "#userId", expire = 300, cacheType = CacheType.BOTH) @Override public User getUserById(Long userId) { return userRepository.findById(userId); } // 更新缓存 @CacheUpdate(name = "userCache", key = "#user.id") @Override public void updateUser(User user) { userRepository.save(user); } // 删除缓存 @CacheInvalidate(name = "userCache", key = "#userId") @Override public void deleteUser(Long userId) { userRepository.deleteById(userId); }}
五、与 Spring Cache 的对比
  • 原生 TTL 支持:JetCache 的 @Cached 直接支持过期时间配置,而 Spring Cache 需通过 @CacheEvict 结合 SpEL 实现。
  • 多级缓存:JetCache 内置 LOCAL/REMOTE/BOTH 三种存储类型,Spring Cache 需手动集成多级缓存组件(如 Caffeine+Redis)。
  • 性能优化:JetCache 针对高并发场景优化了锁机制与批量操作,适合分布式环境;Spring Cache 更适用于简单单机场景。
六、总结

JetCache 通过注解驱动、多级缓存与高性能设计,为分布式系统提供了易用且高效的缓存解决方案。其与 Spring 的深度集成降低了开发成本,适合电商、社交等需要处理高并发读写的业务场景。合理配置本地缓存与远程存储的比例,可进一步优化系统性能与资源利用率。