文章目录
- 前言
- @Cacheable 的来源
- 应用场景
- 集成Redis的思路
- 代码及验证
- 后记
前言
Spring 有很多声明式的编程风格,@Transactional 是,@Cacheable 也是。说起 @Transactional,复杂的事务情况下,这个注解也有局限,需要用到编程式的事务完成需求。同样地,@Cacheable 也是适合简单的缓存场景
@Cacheable 的来源
- 来自 Spring Framwork - Integration。
- Spring Framwork - Integration - Cache 官方reference
在 Integration 项目中,查了下资料,是受 《Enterprise Integration Patterns 》的启发,内容待研究,本文不提。
- 沿袭官方的称呼,后文把这个包都称为 Cache Abstraction
-
相关的注解还有
- @Cacheable: Triggers cache population. 笔记:方法返回值写入缓存
- @CacheEvict: Triggers cache eviction. 笔记:清除缓存
- @CachePut: Updates the cache without interfering with the method execution. 笔记:更新缓存,强调不干扰方法执行
- @Caching: Regroups multiple cache operations to be applied on a method. 笔记:v支持缓存组合操作
- @CacheConfig: Shares some common cache-related settings at class-level. 笔记:作用其实跟@RequestMapping差不多
-
缓存的增删改查的修饰,比如缓存名、缓存的key、缓存的value,都声明为注解参数或者方法返回值
- cacheNames 笔记:缓存名
- key 笔记:对应缓存名的key
- keyGenerator 笔记:更详细的key处理方式
- cacheManager 笔记:非必填,需要了解这个参数的时候再填
- cacheResolver 笔记:非必填,需要了解这个参数的时候再填
摘一个原文,提醒互斥的参数不要同时存在在注解上。
Similarly to key and keyGenerator, the cacheManager and cacheResolver parameters are mutually exclusive, and an operation specifying both results in an exception, as a custom CacheManager is ignored by the CacheResolver implementation. This is probably not what you expect.
-
应用场景
类比 @Transactional,无论应用集成的是MySQL、Oracle、PostgreSQL,用该注解都能获得事务支持。
同样的,@Cacheable 等注解,背后可以是简单的 ConcurrentHashMap ,也可以是 Redis.
集成Redis的思路
本质上跟 @Transactional 集成 MySQL 没什么太大区别。注意Spring Boot 项目可以很方便的引入 spring-data-redis
- spring-data-redis 里面有 cacheManager 的实现类注入到容器中,侧面应证了这个项目支持 Cache Abstraction
- spring-data-redis 官方文档说明,可选两种驱动实现,这里选Jedis
- spring-data-redis 官方文档说明,注入符合需求的 bean,这里 JedisConnectionFactory
- 按照 Cache Abstraction 的规范,注入符合需求的 bean,这里注入 RedisCacheManager
- @EnableCaching 在启动类启用 Cache Abstraction 支持
代码及验证
github
允许单元测试,注意可以断点的方式确认缓存写入、缓存生效(不调用方法内的逻辑)
后记
Cache Abstraction 缓存的增删改查,跟着官网,实现起来都很简单。针对只读的数据,提升响应速度,用这个注解可以让代码更清爽。更高级的用法,比如设置TTL,官网也有例子。在使用redis集群的时候,配合 spring-data-redis,限制就稍微多点,目前觉得这个场景下用这个抽象没有安全感。另外,Spring Boot 或是 Spring 的集成还是很有自己的风格的,看看文档,决定配置,把配置bean注入,集成就完成拉。后续从架构的角度学学 《Enterprise Integration Patterns》,窥探一下 Spring Framwork - Integration 背后参考的架构设计。