本文目录:
- 1.添加 Maven 依赖
- 2.配置redis属性
- 3.创建 redisCacheManager
- 4.使用Spring提供的注解,实现缓存数据到 Redis
- 5.完成对操作过程中数据的缓存
- 6.附 demo 实例
Spring Boot 缓存,默认使用的是 ConcurrentMap 的方式来实现的,然而我们在项目中并不会这么使用。我们经常会引入第三方缓存框架,来完成对数据的缓存操作。比如说:Redis 。本文就来介绍 Spring Boot 整合 Redis 来实现数据的缓存。
1.添加 Maven 依赖
<!--引入 redis starter 的maven依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置redis属性
spring.redis.host=192.168.204.211
spring.redis.port=6379
spring.redis.password=xxx
spring.redis.database=0
# 设置连接池配置等(如有需要)
spring.redis.lettuce.pool.max-active=xxx
spring.redis.lettuce.pool.max-idle=xxx
配置好 redis 相关属性之后,Spring Boot 在项目启动时,便会自动为我们注入 redisTemplate、stringRedisTemplate 组件。
因为我们操作缓存大多数都是对字符串进行操作。所以为我们专门抽取出来的一个 stringRedisTemplate 组件,方便我们的使用。
3.创建 redisCacheManager
引入 redis 来实现缓存,此时我们便使用 RedisCacheManager 来进行管理了。我们在使用 RedisCacheManager 来操作 redis 时,底层操作默认使用的是 RedisTemplate,而 redisTemplate 是 redisAutoConfiguration 在项目启动时帮我们自动注册的组件,它默认使用的是 JDK 序列化机制。所以在 redis 存储时,会出现类似乱码的情况出现。所以我们需要来自己配置 redisCacheManager。
新建一个配置类 MyRedisConfig.java
,使用@Configuration 注解来标注该类是一个配置类。然后使用 @Bean 注解为 IOC 容器注册我们自定义的 redisCacheManager,代码如下所示:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
/**
* 自定义 Redis缓存相关配置
*/
@EnableCaching
@Configuration
public class MyRedisConfig {
/**
* 自定义CacheManager管理器
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory){
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//这一句必须要,作用是序列化时将对象全类名一起保存下来
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(300))//设置 key 过期时间
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) //设置key序列化规则
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))//设置value序列化规则
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
4.使用Spring提供的注解,实现缓存数据到 Redis
使用 @Cacheable
、@CachePut
、@CacheEvict
等注解来实现缓存功能,此处不再过多介绍,可参考:Spring 缓存在项目中的使用。测试图如下所示:
5.完成对操作过程中数据的缓存
使用 @Cacheable 等注解,都是将最终的结果进行缓存。如果我们需要对过程中的部分数据也进行缓存,我们此时就需要使用 RedisCacheManager
来手动操作。
/**
* 如果有多个cacheManager,也可以来手动指定使用哪个
*/
@Override
@Cacheable(value = "user", key = "#root.methodName +'['+ #id +']'",cacheManager = "redisCacheManager")
public User getUser(Integer id) {
log.info("用户"+id+"开始执行数据库查询");
User user = userMapper.getUser(id);
return user;
}
也可以直接使用CacheManager来对中间结果缓存
@Override
public User getUser(Integer id) {
log.info("用户"+id+"开始执行数据库查询");
User user = userMapper.getUser(id);
//可以直接使用CacheManager来对中间结果缓存
Cache cache = cacheManager.getCache("user");
cache.put("test",1111);
return user;
}