在redis客户端set进值之后,从程序中用redisTemplate读取该值报如下错误
Unrecognized token 'redis': was expecting ('true', 'false' or 'null')
看报错,是jason转换异常,实际上是因为redisTemplate在做数据存储的时候会把存储的内容序列化,所以,redisTemplate读取的时候也会反序列化,而在redis客户端set的时候并不会做序列化,因此set的进去的值在用redisTemplate读的时候就会报类型转换异常了。
看一下get redis结果的源码:
public V get(Object key) {
return this.execute(new AbstractOperations<K, V>.ValueDeserializingRedisCallback(key) {
protected byte[] inRedis(byte[] rawKey, RedisConnection connection) {
return connection.get(rawKey);
}
}, true);
}
在执行execute的时候,会调用ValueDeserializingRedisCallback 这个内部类中的doinRedis方法以及在初始化内部类的时候会初始化key。
abstract class ValueDeserializingRedisCallback implements RedisCallback<V> {
private Object key;
public ValueDeserializingRedisCallback(Object key) {
this.key = key;
}
//就是这个doInRedis方法,里面有一个rawKey(),该方法序列化了key,并且返回的是一个字符串数组,然后deserializeValue 反序列化result值。
public final V doInRedis(RedisConnection connection) {
byte[] result = this.inRedis(AbstractOperations.this.rawKey(this.key), connection);
return AbstractOperations.this.deserializeValue(result);
}
@Nullable
protected abstract byte[] inRedis(byte[] var1, RedisConnection var2);
}
可以看到用deserialize方法反序列了get出来的值。
解决办法,最简单的就是用程序重新set一遍即可。
网友评论