Springboot 2.0 - 整合redis
序
最近在入門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。
完