• SpringBoot整合Redis注意的一些问题


    1:ERR value is not an integer or out of range

    1-1:背景

    使用redisTemplate.opsForValue().increment(key, delat)方法。

    1-2:分析

    分析:redis对任何不合法的值,都称为ERR。只有使用StringRedisSerializer序列化器才能使用incrment或者decrement方法

    1-3:问题解决

    使用GenericToStringSerializer、StringRedisSerializer序列化器,都可以使用increment方法.

    1-4:建议

    建议redis key序列化使用StringRedisSerializer,redis value序列化使用Jackson2JsonRedisSerializer。

    1-5:代码示例

      /**
         * key redis serializer: {@link StringRedisSerializer} and
         * key redis serializer: {@link Jackson2JsonRedisSerializer}
         **/
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            Jackson2JsonRedisSerializer valueRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            //设置Redis的value为json格式,并存储对象信息的序列化类型
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            valueRedisSerializer.setObjectMapper(objectMapper);
    
            RedisSerializer keyRedisSerializer = new StringRedisSerializer();
            template.setKeySerializer(keyRedisSerializer);
            template.setValueSerializer(valueRedisSerializer);
            template.setHashKeySerializer(keyRedisSerializer);
            template.setHashValueSerializer(valueRedisSerializer);
            template.setConnectionFactory(factory);
            template.afterPropertiesSet();
    
            return template;
        }

    2:key前面会有一堆xacxedx00x05tx00 b

    2-1:分析

    分析spring-data的org.springframework.data.redis.core.RedisTemplate源代码以后发现。SpringBoot默认采用defaultSerializer = new JdkSerializationRedisSerializer();来对key,value进行序列化操作,在经过查看JdkSerializationRedisSerializer中对序列化的一系列操作,即默认使用。由于spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,jedis中提供了string类型转为byte[]类型。原因其实就出现在这里,解决的办法就是手动定义序列化的方法。

    从SpringBoot data redis中RedisTemplate源码可以看出,默认的key/value序列化类是JdkSerializationRedisSerializer。所以会造成持久化时,出现16进制编码的数据。

     2-2:解决

     使用上面的代码示例即可。key序列化类使用StringRedisSerializer,value序列化类使用Jackson2JsonRedisSerializer即可,采用JSON存储value即可。

  • 相关阅读:
    Hadoop学习笔记
    Hadoop学习笔记 -伪分布式
    SSH 连接报错总结
    Hadoop学习笔记
    Trie 前缀树/字典树
    解数独(Leetcode-37 / HDU-1426)/回溯/状态压缩
    MyBatis 多表关联查询
    python_37期自动化【lemon】
    api课堂笔记_day14
    api课堂笔记_day12&day13
  • 原文地址:https://www.cnblogs.com/liuenyuan1996/p/10213512.html
Copyright © 2020-2023  润新知