Spring Boot 中使用 Redis 做集中式缓存
Spring Boot 文档中定义了对项目中的缓存,提供的一种简便的解决方案,可以通过注解的方式设置需要缓存的方法,从而减少缓存代码和业务代码的耦合,并且可以方便得集成第三方缓存技术。
缓存配置
在 Spring Boot 中通过 @EnableCaching
注解自动化配置合适的缓存管理器(CacheManager),Spring Boot 将根据下面的顺序去侦测缓存提供者:
- Generic
- JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
- EhCache 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Simple
也可以通过配置属性 spring.cache.type
来强制指定。
Maven
<!-- cache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
Application
@EnableTransactionManagement @SpringBootApplication @EnableCaching public class SunWebApplication { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Bean public Object testBean(PlatformTransactionManager platformTransactionManager){ logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> platformTransactionManager name: " + platformTransactionManager.getClass().getName()); return new Object(); } public static void main(String[] args) { SpringApplication.run(SunWebApplication.class, args); } }
Service
@CacheConfig(cacheNames = "users") public interface UserService { /** * 根据用户名查询用户信息 * @param username * @return */ @Cacheable Users findByUsername(String username); }
yml
cache: type: redis redis: host: 172.0.0.1 port: 6379 password: "pwd" database: 0 timeout: 50ms
注解的使用
@Cacheable
标记方法为被缓存的方法,当通过参数拼接出的key在缓存中找不到对应的value时,会调用该方法,然后将参数以一定规则拼接为key,方法的返回值作为value记录到缓存数据库中。常用于select操作。
主要属性:
** cacheNames(value) **:缓存名,可指定多个。
** key **:缓存的key的取值规则,可通过SpEl表达式自定义,如#code,则表示key取值为传入的code参数。为空则默认将所有参数拼接为一个key值。
** condition **:记录缓存的条件,可通过SpEl表达式自定义,保证表达式返回true或false,返回true时才会记录缓存。
@CacheEvict
标记方法为更新缓存方法,当此方法被调用后,会清空缓存,从而让被@Cacheable标记的方法在调用时重新获取值存入缓存。常用于delete操作。
主要属性:
前三个属性与@Cacheable注解类似,除了condition,这里的condition是返回true时才会清除缓存。
** allEntries **:是否清空所有缓存,默认为false。默认情况是只有key值相同的缓存才会被清除,若指定为true,则清空所有cacheName相同的缓存记录。
** beforeInvocation **:是否在调用方法之前就执行清除缓存操作,默认是false,当调用方法抛出异常时不会清除缓存,如果指定为true就表示无论方法是否执行成功,都一定会清除缓存。
@CachePut
与@Cacheable注解一样都可以使标记方法被缓存,但不同之处在于,@CachePut标记的方法无论是否有缓存记录都会被执行,因此常用于update操作。
@CacheConfig
作用于类上,可以为此类所有的方法上的缓存注解设置默认的属性。
如:@CacheConfig(cacheNames = "users")
则标记的类的所有方法上的缓存相关注解的cacheNames属性默认都为"users"。
REFER:
https://github.com/alibaba/jetcache
https://gitee.com/ld/J2Cache
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-caching