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

  • 相关阅读:
    H50055:html 页面加载完后再加载js文件 ,url带有时间戳后缀
    H50054:html 页面自动刷新 http-equiv属性
    WebGL_0015:参数值在一定范围内循环变化
    H50053:switch 判断范围
    WebGL_0014:改变相机的刷新颜色
    WebGL_0013:JQuery获取json文件 读取数据
    WebGL_0012:三维讲解导航模板 Icon方式
    H50052:按钮 禁止 选择 拖拽 右键
    滑动窗口的最大值(队列)
    MapReduce程序编写过程
  • 原文地址:https://www.cnblogs.com/liuenyuan1996/p/10213512.html
Copyright © 2011-2022 走看看