RedisTemplate的序列化问题研究

RedisTemplate

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redistemplate 可以将java对象set成json字符串,但是get的时候却不能直接返回响应的对象,而是一个LinkedHashMap。
1、怎么样才能更优雅的用指定的对象接收?
2、key set 1.6  返回是Double类型的1.6, 将key incrby 1.4,现在key的值变成了3, 现在get 返回的是Integer类型的3 。这种存在类型变化的情况,用固定类型不太好接收返回
还是这个问题,怎么样优雅的接收返回值。

Jackson 插入的值都带有双引号, 类似这种的,"\"1\"" ,不能进行incr incrby系列的操作
127.0.0.1:6379> get testvalue
"1"
127.0.0.1:6379> incrby testvalue 1
ERR value is not an integer or out of range


JdkSerializationRedisSerializer 这个默认的序列化,序列化的字符串带有type(类型全限定名),表明了当前字符串值是什么类型。
1、这种带有type(类型全限定名)数据,如果是自定义对象在不同的系统之间传递不太方便(因为不同的系统之间全限定类名很少一样的)。
2、hash类型,用put填入的值,带有type(类型全限定名),不能用increment。 increment的hash,值是字符串的,没有type

 StringRedisSerializer stringSerializer = new StringRedisSerializer();
 这个序列化的工具只能 set,和get string类型的数据, Integer,Long,自定义对象等等都都不行
 
 
StringRedisTemplate

等同于 RedisTemplate 他们只能用StringRedisSerializer,用其他类型的序列化会出现各种各样的问题。
比如用Jackson2JsonRedisSerializer 获取json字符的value,会报下面的错误
class java.util.LinkedHashMap cannot be cast to class java.lang.String (java.util.LinkedHashMap and java.lang.String are in module java.base of loader 'bootstrap')

问题:怎样用RedisTemplate优雅的取出想要的数据类型呢?取出数据后不需要强制类型转换,在redis里面呈现的数据可读性高,可以进行incr,incrby等操作。

答案:使用RedisTemplate Jackson2JsonRedisSerializer序列化工具或者用StringRedisRemplate,再用fastjson,jackson等序列化工具自己来序列化和反序列化处理。

jedis等其他一些客户端估计也是这么一个套路。

 

你可能感兴趣的:(redis)