fine-cache模块
- 数据缓存
依赖
- pom.xml
xml
<!--fine-cache-->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-cache</artifactId>
<version>${fine.version}</version>
<!-- 如果引用fine-auth,排除redis依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</exclusion>
</exclusions>
</dependency>配置
- src/main/resources/application.yml
yaml
# 使用连接池配置
spring:
profiles:
include: cache
data:
redis:
port: 6379
host: 127.0.0.1
password:
database: 0
timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0启动类开启缓存
java
@EnableCaching
public class FineExampleApplication {
// xxx:启动程序
}使用缓存
java
// 添加缓存
@Cacheable(value="name",key="#student.id",condition="#student.id>2")
// 清除缓存
@CacheEvict(value="name",allEntries=true)创建子模块:fine-cache
- 在fine-parent中创建:fine-cache子模块
fine-cache
- 创建子模块:New > Module...
- 添加redis缓存依赖
- 添加缓存配置
依赖
- fine-cache/pom.xml
xml
<dependencies>
<!-- redis缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- spring-cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
<!--fine-commons-->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-commons</artifactId>
<version>${fine.version}</version>
<optional>true</optional>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
</dependencies>缓存application-cache.yml
- src/main/resources/application-cache.yml
yaml
# 缓存配置
spring:
cache:
type: redis
redis:
# 项目前缀
key-prefix: "${spring.application.name}:"
# 缓存过期时间:单位分钟,43200分钟 = 30天
# time-to-live: 43200缓存配置类
- cn/finemap/cache/RedisConfig.java
java
@Configuration
@EnableCaching
@SuppressWarnings("all")
public class RedisConfig {
//项目前缀
@Value("${spring.cache.redis.key-prefix}")
private String prefix;
// 缓存过期时间:分钟
@Value("${spring.cache.redis.time-to-live:43200}")
private long ttl;
/**
* 配置缓存序列化方式
* @return
*/
@Bean
public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() {
String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
ObjectMapper objectMapper = new ObjectMapper();
// 处理Date类型
objectMapper.setDateFormat(new SimpleDateFormat(DATE_TIME_FORMAT));
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
objectMapper.registerModule(new JavaTimeModule()
// 处理LocalDateTime类型
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)))
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))));
// 序列化java对象时,将类的信息写入redis
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
return new GenericJackson2JsonRedisSerializer(objectMapper);
}
/**
* RedisTemplate配置
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(@Autowired(required = false) RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//key 采用的String 的序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
//hashde key 也采用String的序列化方式
redisTemplate.setHashKeySerializer(stringRedisSerializer);
//value 序列化方式采用jackson
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer());
//hash 的 value序列化方式采用jackson
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer());
// 默认序列化方式
redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 配置缓存管理器
* @param factory
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
// 配置序列化方式
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(ttl)) // 配置缓存时长
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer()))
.prefixCacheNameWith(prefix); // 添加统一前缀;
// 配置缓存管理器
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}维护父工程:fine-parent
fine-parent
- 添加该子模块
- 在父工程中,管理版本参数
pom
- fine-parent/pom.xml
xml
<!-- 版本参数 -->
<properties>
<!-- fine-cache -->
<commons-pool2.version>2.11.1</commons-pool2.version>
</properties>fine-cache使用
- 在启动类中添加
@EnableCaching,开启缓存支持。 - 注解会利用配置好的
CacheManager的缓存前缀和缓存时长。 - 工具类已经配置缓存前缀
注解使用
java
// 添加缓存
@Cacheable(value = "user", key = "#paramName")
public Result<User> getData(String paramName){
// 如果redis中存在,直接返回
// 如果redis中不存在,执行函数,返回结果存储到系统中
// 存储名称:应用名称前缀:user::paramName,存储值为Result序列化后的String
}
// 清除缓存
@CacheEvict(cacheNames = "user", key = "#paramName", allEntries=true)
public void clearData(String paramName){
// 根据存储名称清除数据
}工具类
java
// 获取缓存工具类
@Autowired
private RedisUtils redisUtils;RedisTemplate
- 推荐使用应用名称作为缓存前缀
java
// 获取缓存Bean
@Resource
private RedisTemplate redisTemplate;