zoukankan      html  css  js  c++  java
  • 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即可。

  • 相关阅读:
    centos7下部署iptables环境纪录(关闭默认的firewalle)
    JVM性能调优2:JVM性能调优参数整理
    增加swap分区,文件形式
    常用nginx rewrite重定向-跳转实例:
    nginx反向代理解决跨域
    Python,Jupyter Notebook,IPython快速安装教程
    Python之NumPy实践之数组和矢量计算
    Python之IPython开发实践
    技术应用涉及到的四个方面的问题
    Python Base of Scientific Stack(Python基础之科学栈)
  • 原文地址:https://www.cnblogs.com/liuenyuan1996/p/10213512.html
Copyright © 2011-2022 走看看