前言
SpringCache是Spring提供的一整套的缓存解决方案,它不是具体的缓存实现,它只提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案。提供了多种缓存实现方式,如Ehcache、Redis、Guava等。
ConcurrentMapCache是Spring 内置默认的缓存实现。
Spring Cache入门
使用Spring Cache也比较简单,简单总结就是3步:加依赖,开启缓存、加注解。
1、加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2、启动类上添加@EnableCaching
注解
3、加注解
常用注解
@Cacheable:在方法执行前查看是否有缓存对应的数据,如果有直接返回数据,如果没有调用方法获取数据返回,并缓存起来。
@CacheEvict:将一条或多条数据从缓存中删除。
@CachePut:将方法的返回值放到缓存中。
SpringBoot集成Caffeine
1、新建一个SpringBoot项目
2、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
3、修改配置文件
spring:
cache:
type: caffeine
4、添加配置类
@Configuration
public class CaffeineCacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.initialCapacity(100)
.maximumSize(10000))
;
return cacheManager;
}
}
SpringBoot集成Redis Cache
1、新建一个SpringBoot项目
2、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3、修改配置文件
spring:
cache:
type: redis
redis:
time-to-live: "10s"
data:
redis:
host: 127.0.0.1
database: 1
lettuce:
pool:
min-idle: 5
max-active: 5000
max-idle: 10
max-wait: 1000ms
4、添加配置类
@EnableCaching
@Configuration
public class CacheConfiguration {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 使用缓存的默认配置
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
// 使用 GenericJackson2JsonRedisSerializer 作为序列化器
config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config);
return builder.build();
}
}