• SpringBoot整合Redis_自定义RedisTemplate


    Redis中传输的数据均需序列化,作为传输数据的类需要实现Serializable接口

    Redis官方提供了两个RedisTemplate,分别为RedisTemplate与StringRedisTemplate

    1. @AutoConfiguration
    2. @ConditionalOnClass(RedisOperations.class)
    3. @EnableConfigurationProperties(RedisProperties.class)
    4. @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
    5. public class RedisAutoConfiguration {
    6. @Bean
    7. @ConditionalOnMissingBean(name = "redisTemplate")
    8. @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    9. public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    10. RedisTemplate template = new RedisTemplate<>();
    11. template.setConnectionFactory(redisConnectionFactory);
    12. return template;
    13. }
    14. @Bean
    15. @ConditionalOnMissingBean
    16. @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    17. public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    18. return new StringRedisTemplate(redisConnectionFactory);
    19. }
    20. }

    在官方提供的RedisTemplate中,并未对序列化做出设置,默认使用JDK序列化

    而实际开发中,经常根据需求的不同,使用不同的序列化方式,为此我们可以自定义RedisTemplate

    需要注意的是:自定义的RedisTemplate方法需命名为RedisTemplate,即与官方提供的版本同名,@ConditionalOnMissingBean(name = "redisTemplate")注解表示仅在容器中无该名称的bean时,该bean才会被注入容器,我们需要通过同名bean使官方版本失效

    自定义RedisTemplate

    代码相关说明写在注释中

    1. @Configuration
    2. public class RedisConfig {
    3. @Bean
    4. public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    5. //数据泛型类型
    6. RedisTemplate template = new RedisTemplate<>();
    7. //设置连接工厂(Jedis或Lettuce)
    8. template.setConnectionFactory(redisConnectionFactory);
    9. /*
    10. 自定义JSON序列化设置
    11. */
    12. //创建JSON序列化工具
    13. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    14. //创建序列化规则objectMapper 工具将会遵循objectMapper中定义的规则
    15. ObjectMapper objectMapper=new ObjectMapper();
    16. //设置序列化可见度(PropertyAccessor表示序列化的范围 Visibility用于设置访问权限(访问修饰符))
    17. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    18. //启动"自行在JSON中添加类型信息" 并进行相关设置(若无需反序列化可不设置)
    19. objectMapper.activateDefaultTyping(
    20. objectMapper.getPolymorphicTypeValidator(), //多态类型验证程序(必须参数)
    21. ObjectMapper.DefaultTyping.NON_FINAL, //允许序列化的类型(此处表示类不可被final修饰 但String, Boolean, Integer, Double除外)
    22. JsonTypeInfo.As.WRAPPER_ARRAY); /*
    23. 类型信息在JSON中的形式(默认为WRAPPER_ARRAY)
    24. WRAPPER_ARRAY
    25. WRAPPER_Object
    26. PROPERTY
    27. 若不需要反序列化 即不需要类的类型信息 则可使用EXISTING_PROPERTY
    28. 下文中会详细说明不同参数对类型信息在JSON中的形式的影响
    29. */
    30. //将objectMapper传入工具
    31. jackson2JsonRedisSerializer.setObjectMapper(objectMapper);//JSON序列化与反序列化将会遵循objectMapper中定义的规则
    32. //设置key的序列化方式---String
    33. template.setKeySerializer(RedisSerializer.string());
    34. template.setHashKeySerializer(RedisSerializer.string());
    35. //设置value的序列化方式---JSON(上方自定义的JSON序列化设置)
    36. template.setValueSerializer(jackson2JsonRedisSerializer);
    37. template.setHashValueSerializer(jackson2JsonRedisSerializer);
    38. //初始化RedisTemplate的参数设置
    39. template.afterPropertiesSet();
    40. return template;
    41. }
    42. }

    关于JsonTypeInfo的说明

    不同的JsonTypeInfo参数,决定了不同的类型信息存储形式

    WRAPPER_ARRAY
            [
            "类的全限定名",
            {
            "属性名": "值",
            "属性名": 值
            }
            ]
    
    WRAPPER_OBJECT
            {
            "类的全限定名": {
            "属性名": "值",
            "属性名": 值
            }
            }
    
    PROPERTY
            {
            "@class": "类的全限定名",
            "属性名": "值",
            "属性名": 值
            }
    
    EXISTING_PROPERTY
            {
            "属性名": "值",
            "属性名": 值
            }
    
  • 相关阅读:
    别再用if-else了,分享一下我使用“策略模式”的项目经验...
    c#设计模式-行为型模式 之 备忘录模式
    SystemVerilog学习 (9)——随机化
    【IJCV】基于概率表征的半监督对比学习框架,FaceChain团队出品
    Java项目:SSM企业OA管理系统
    电商项目之百万级别的临时订单数据补偿解决方案
    6 - 字典
    【深度学习 AIGC】stablediffusion-infinity 在无界限画布中输出绘画 Outpainting
    微信小程序----父子组件之间通信
    LS最小二乘圆拟合
  • 原文地址:https://blog.csdn.net/Mudrock__/article/details/127546778