前言
- SpringBoot默认开启的缓存管理器是ConcurrentMapCacheManager,创建的缓存实际上是ConcurrentMapCache,将缓存数据保存在ConcurrentHashMap中
- 可以自由加入缓存中间件,如redis、memcache、enchache等,当导入jar包时,springboot会自动导入相关的bean,此时使用缓存注解即可将数据存入redis中。
步骤:
- 安装redis,开启redis。
我是在虚拟机上安装的redis,所以需要注意配置文件中的位置和端口,以及是否设置了密码等问题,还需要关闭防火墙,否则可能产生连接不上redis的问题。注意:端口号前面的ip应该为*号显示。如果你是在win上安装,直接开启即可。
redis.config中的注意事项
取消防火墙指令:
systemctl stop firewalld(默认)
systemctl disable firewalld.service(设置开启不启动)
连接redis成功
-
添加pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
在application.properties中配置redis地址
spring.redis.host=此处输入你的redis地址
-
此时已经启动了redis缓存,可以使用了,需要在service上添加对应的@Cachable等注解以及在核心启动类上添加@EnableCaching注解,详细请查看上一篇springboot缓存使用
springboot缓存使用 。但为了方便查看,需要自定义RedisCacheManager,将对象序列化的方式由jdk变为json。
@Configuration
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换
RedisSerializer<String> strSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jacksonSeial =
new Jackson2JsonRedisSerializer(Object.class);
// 解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
// 定制缓存数据序列化方式及时效
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(strSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(jacksonSeial))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager
.builder(redisConnectionFactory).cacheDefaults(config).build();
return cacheManager;
}
}
-
测试:
- 查询后,执行了查询数据库的操作,并且将查询结果存入了redis中,并且结果显示为json格式
- 第二次查询直接从redis中获取,不再执行sql语句。
总结:
- 启动redis,导入redis的jar包并配置好地址即可在springboot中使用redis缓存
- 注意自定义配置类将序列化的方式由jdk改为json