序
最近在入门 SpringBoot, 然后在感慨 SpringBoot 较于 Spring 真的方便多时, 顺便记录下自己在集成 Redis 时的一些想法.
1, 从 springboot 官网查看 Redis 的依赖包
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-Redis</artifactId>
- </dependency>
2, 操作 Redis
- /*
- 操作 k-v 都是字符串的
- */
- @Autowired
- StringRedisTemplate stringRedisTemplet;
- /*
- 操作 k-v 都是对象的
- */
- @Autowired
- RedisTemplate redisTemplate;
Redis 的包中提供了两个可以操作方法, 根据不同类型的值相对应选择.
两个操作方法对应的 Redis 操作都是相同的
- stringRedisTemplet.opsForValue() // 字符串
- stringRedisTemplet.opsForList() // 列表
- stringRedisTemplet.opsForSet() // 集合
- stringRedisTemplet.opsForHash() // 哈希
- stringRedisTemplet.opsForZSet() // 有序集合
3, 修改数据的存储方式
在 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 中的对象.
4, 更改默认的缓冲
springboot 默认提供基于注解的缓冲, 只要在主程序类 (xxxApplication) 标注 @EnableCaching, 缓冲注解有
@Cachingable,@CachingEvict,@CachingPut, 并且该缓冲默认使用的是 ConcurrentHashMapCacheManager
当引入 Redis 的 starter 后, 容器中保存的是 RedisCacheManager ,RedisCacheManager 创建 RedisCache 作为缓冲组件, RedisCache 通过操纵 Redis 缓冲数据
5, 修改 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.
完
来源: https://www.cnblogs.com/LxyXY/p/9741921.html