redis官网:http://www.redis.cn
源码地址:https://github.com/877148107/springboot_integrate/tree/master/springboot-integrate-cache-redis
-
安装redis
1.用docker安装redis
docker命令:docker pull registry.docker-cn.com/library/redis、docker pull redis
2.启动redis
docker命令:docker run -d -p 6379:6379 --name myredis 44d36d2c2374(IMAGE ID)
3.redis工具连接
-
SpringBoot整合Redis
1.引入spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置redis主机地址
spring.redis.host=192.168.0.113
3.测试redis是否生效
@SpringBootTest
class SpringbootIntegrateCacheRedisApplicationTests {
@Autowired
EmployeeService employeeService;
@Autowired
RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Autowired
RedisTemplate empRedisTemplate;
@Test
void testRedis(){
empRedisTemplate.opsForValue().set("emp-01",employeeService.getEmp(3));
}
@Test
void contextLoads() {
Employee emp = employeeService.getEmp(3);
System.out.println(emp);
}
}
-
Redis自动配置原理
1.redis自动配置类RedisAutoConfiguration、redis缓存配置类RedisCacheConfiguration
@AutoConfigureAfter自动配置类加载完成后加载此类
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisConnectionFactory.class)
//自动配置类加载完成后加载此类
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class RedisCacheConfiguration {
2.RedisCacheConfiguration给容器中添加RedisCacheManager
@Bean
RedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,
ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,
ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,
RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(
determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));
List<String> cacheNames = cacheProperties.getCacheNames();
if (!cacheNames.isEmpty()) {
builder.initialCacheNames(new LinkedHashSet<>(cacheNames));
}
redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return cacheManagerCustomizers.customize(builder.build());
}
3.RedisCacheManager创建RedisCache作为缓存组件,RedisCache通过操作redis缓存数据
redis的序列化机制默认使用的jdk序列化机制
/**
* Configuration hook for creating {@link RedisCache} with given name and {@code cacheConfig}.
*
* @param name must not be {@literal null}.
* @param cacheConfig can be {@literal null}.
* @return never {@literal null}.
*/
protected RedisCache createRedisCache(String name, @Nullable RedisCacheConfiguration cacheConfig) {
return new RedisCache(name, cacheWriter, cacheConfig != null ? cacheConfig : defaultCacheConfig);
}
4.redis缓存用JSON格式存储
由于Spring boot2.x与Springboot1.x不同,因此作废缓存处理方式不同
springboot2.x如下
@Configuration
public class MyRedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
Jackson2JsonRedisSerializer<Object> redisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
redisSerializer.setObjectMapper(objectMapper);
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer));
RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).build();
return redisCacheManager;
}
}
Springboot1.x如下
@Configuration
public class MyRedisConfig {
@Bean(value = "empRedisTemplate")
public RedisTemplate<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> serializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
template.setDefaultSerializer(serializer);
return template;
}