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前面會有一堆\xac\xed\x00\x05t\x00\tb

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即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM