更新以前的博客
最近在使用SpringBoot整合Redis,网上的整合项目千篇一律,对于细节问题和在实际的开发过程中如何进行配置和使用自己一直没搞明白,再此将自己的一点思路整理下来,供后面参考。
关于注解:@SpringBootApplication注解其实就是以下三个注解的合成
@Configuration//将此类声明为配置类
@EnableAutoConfiguration//SpringBoot加载所有的@Configuration配置类创建IOC容器进行bean的注册
@ComponentScan//扫描启动类路径下的所有包
Spring自身带有缓存机制,在启动类中添加注解@EnableCaching开启Spring中的缓存机制,也可以在xml文件中使用标签方式开始缓存
在启用spring的缓存之后,如果没有配置其他的缓存管理器,spring则启用默认的缓存管理器,对于Spring自带的缓存管理器一般在项目中不使用,而是使用Redis作为缓存。
此处在本地环境下进行配置redis
在applications.properties中配置redis服务器和连接池的相关属性
#redis的配置
# 配置redis服务器的属性
spring.redis.password=123456
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.timeout=50000
# 配置redis连接池的属性
spring.redis.database=0
spring.redis.jedis.pool.max-wait=8
在springBoot中的application.properties中配置redis的服务器和连接池的属性,这样springboot的自动装配机制会自动读取这些配置文件并生成相关的redis操作对象,会自动生成RedisConnectionFactory、RedisTemplate和StringRedisTemplate对象等。
Redis与java进行连接需要连接驱动Jedis
RedisConnectionFactory会创建RedisConnection对象连接redis服务器
在Spring中提供了接口CacheManager来定义缓存管理器,这样各个不同的管理器通过实现此接口来提供缓存的功能,而在Spring-data-redis中提供实现了CacheManager的接口RedisCacheManager,通过此接口来定义redis的缓存管理器。
@Configuration //声明此类为配置类
public class RedisConfig {
/*
* SpringBoot会自动读取配置文件并生成链接工厂对象
*/
@Autowired
RedisConnectionFactory redisConnectionFactory;
/*
* 获取链接工厂用于创建connection链接
* 在实际项目过程之中可能需要设置主机密码等信息
*/
@Bean
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
//此处可以进行工厂信息的设置
return new JedisConnectionFactory(config);
}
/**
* 重新注入RedisTemplate,覆盖springboot提供的RedisTemplate
* @return
*/
@Bean
public RedisTemplate<String, Object> getRedisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
//将redis连接工厂设置到模板类之中
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化(默认采用的是JDK序列化)
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用String的序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
//value的序列化方式采用json
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
在Service层的实现类上可以使用注解进行缓存也可以使用,也可以调用RedisTemplate对象进行缓存
@Cacheable可以使用在方法级别上也可以使用在类级别上,如果使用在类级别上则表示此类下的所有方法都支持缓存
@CacheConfig进行全局配置缓存,可以定义缓存区的名称,一般配置在service层的实现类上