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爛豬皮》 公衆號聊的不僅僅是Java技術知識,還有面試等乾貨,後期還有大量架構乾貨。大家一起關注吧!關注爛豬皮,你會了解的更多.............. 

 

原文:https://www.cnblogs.com/LxyXY/p/9741921.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章