乐趣区

Springboot 2.0 – 集成redis

最近在入门 SpringBoot,然后在感慨 SpringBoot 较于 Spring 真的方便多时,顺便记录下自己在集成 redis 时的一些想法。
从 springboot 官网查看 redis 的依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

操作 redis
/*
操作 k - v 都是字符串的
*/
@Autowired
StringRedisTemplate stringRedisTemplet;

/*
操作 k - v 都是对象的
*/
@Autowired
RedisTemplate redisTemplate;

redis 的包中提供了两个可以操作方法,根据不同类型的值相对应选择。两个操作方法对应的 redis 操作都是相同的
stringRedisTemplet.opsForValue() // 字符串
stringRedisTemplet.opsForList() // 列表
stringRedisTemplet.opsForSet() // 集合
stringRedisTemplet.opsForHash() // 哈希
stringRedisTemplet.opsForZSet() // 有序集合

修改数据的存储方式
在 StringRedisTemplet 中,默认都是存储字符串的形式;在 RedisTemplet 中,值可以是某个对象,而 redis 默认把对象序列化后存储在 redis 中(所以存放的对象默认情况下需要序列化)
如果需要更改数据的存储方式,如采用 json 来存储在 redis 中,而不是以序列化后的形式。
1)自己创建一个 RedisTemplate 实例,在该实例中自己定义 json 的序列化格式(org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer)
// 这里传入的是 employee 对象(employee 要求可以序列化)
Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer<Employee>(Employee.class);

2)把定义的格式放进自己定义的 RedisTemplate 实例中
RedisTemplate<Object,Employee> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 定义格式
Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer<Employee>(Employee.class);
// 放入 RedisTemplate 实例中
template.setDefaultSerializer(jackson2JsonRedisSerializer);

参考代码:
@Bean
public RedisTemplate<Object,Employee>
employeeRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws
UnknownHostException{
RedisTemplate<Object,Employee> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer<Employee>(Employee.class);
template.setDefaultSerializer(jackson2JsonRedisSerializer);
return template;
}

原理:
@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class,
JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}

@Bean
@ConditionalOnMissingBean(
name = {“redisTemplate”}
) // 在容器当前没有 redisTemplate 时运行
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory
redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}

@Bean
@ConditionalOnMissingBean // 在容器当前没有 stringRedisTemplate 时运行
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}

如果你自己定义了 RedisTemplate 后并添加 @Bean 注解,(要在配置类中定义),那么默认的 RedisTemplate 就不会被添加到容器中,运行的就是自己定义的 ReidsTemplate 实例,而你在实例中自己定义了序列化格式,所以就会以你采用的格式定义存放在 redis 中的对象。
更改默认的缓冲
springboot 默认提供基于注解的缓冲,只要在主程序类(xxxApplication)标注 @EnableCaching,缓冲注解有
@Cachingable、@CachingEvict、@CachingPut, 并且该缓冲默认使用的是 ConcurrentHashMapCacheManager
当引入 redis 的 starter 后, 容器中保存的是 RedisCacheManager ,RedisCacheManager 创建 RedisCache 作为缓冲组件,RedisCache 通过操纵 redis 缓冲数据
在此我向大家推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有 Spring,MyBatis,Netty 源码分析,高并发、高性能、分布式、微服务架构的原理,JVM 性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
修改 redis 缓冲的序列化机制
在 SpringBoot 中,如果要修改序列化机制,可以直接建立一个配置类,在配置类中自定义 CacheManager,在 CacheManager 中可以自定义序列化的规则,默认的序列化规则是采用 jdk 的序列化
注:在 SpringBoot 1.5.6 和 SpringBoot 2.0.5 的版本中自定义 CacheManager 存在差异
参考代码:
// springboot 1.x 的版本
public RedisCacheManager employeeCacheManager(RedisConnectionFactory
redisConnectionFactory){

// 1、自定义 RedisTemplate
RedisTemplate<Object,Employee> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);

template.setDefaultSerializer(jackson2JsonRedisSerializer);

// 2、自定义 RedisCacheManager
RedisCacheManager cacheManager = new RedisCacheManager(template);
cacheManager.setUsePrefix(true); // 会将 CacheName 作为 key 的前缀

return cacheManager;
}

// springboot 2.x 的版本

/**
* serializeKeysWith() 修改 key 的序列化规则,这里采用的是 StringRedisSerializer()
* serializeValuesWith() 修改 value 的序列化规则,这里采用的是
Jackson2JsonRedisSerializer<Employee>(Employee.class)
* @param factory
* @return
*/
@Bean
public RedisCacheManager employeeCacheManager(RedisConnectionFactory
redisConnectionFactory) {

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()

. serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<Employee>(Employee.class)));

RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();

return cacheManager;
}

tip:可以通过查看各版本的 org.springframework.data.redis.cache.RedisCacheConfiguration 去自定义 CacheManager.
因为不同版本的 SpringBoot 对应的 Redis 版本也是不同的,所以要重写时可以查看官方是怎么定义 CacheManager,才知道怎样去自定义 CacheManager。
大家觉得文章对你还是有一点点帮助的,大家可以点击下方二维码进行关注。《乐趣区》公众号聊的不仅仅是 Java 技术知识,还有面试等干货,后期还有大量架构干货。大家一起关注吧!关注烂猪皮,你会了解的更多 …………..

退出移动版