今天使用Redis Template进行测试发现的问题, 遇到这个错
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized token 'testtest': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')从github复制过来清除空格后解决,如果没有解决,下面配置序列化可能有所帮助。
调用该测试时出现append方法没用
//不报错,append不管用 @Test public void string5() { redisTemplate.opsForValue().set("k", "test"); redisTemplate.opsForValue().append("k","test"); System.out.println(redisTemplate.opsForValue().get("k")); redisTemplate.opsForValue().append("k","nihaoya"); System.out.println(redisTemplate.opsForValue().get("k")); }需要进行配置 将
//值采用Json序列 template.setValueSerializer(jackson2JsonRedisSerializer);修改为如下形式得以解决
template.setValueSerializer(new StringRedisSerializer());解释如下:
关于数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer)
序列化/发序列化解释JdkSerializationRedisSerializerPOJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。StringRedisSerializer适用于Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成stringJacksonJsonRedisSerializer提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。OxmSerializer提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。上面4种策略中:
JdkSerializationRedisSerializer和StringRedisSerializer是最基础的策略,在设计时仍然不推荐直接使用后面两种,即JacksonJsonRedisSerializer和OxmSerializer,因为无论是json还是xml,他们本身仍然是String。
如果数据需要被第三方工具解析,那么数据应该使用StringRedisSerializer而不是JdkSerializationRedisSerializer。
如果数据格式必须为json或者xml,那么在编程级别,在redisTemplate配置中仍然使用StringRedisSerializer,在存储之前或者读取之后,使用“SerializationUtils”工具转换转换成json或者xml
最后附上配置信息
@Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { //配置连接工厂 StringRedisTemplate template = new StringRedisTemplate(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis 的value值 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); //指定要序列化的域,field,get和set,以及修饰符范围 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //指定序列化输入的类型,类必须是非final类 om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); jackson2JsonRedisSerializer.setObjectMapper(om); //序列化配置为String格式 template.setValueSerializer(new StringRedisSerializer()); // template.setKeySerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; }参考博客:RedisTemplate用法详解