Unrecognized token 'redis': was

2018-09-28  本文已影响0人  syxyabc

在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一遍即可。

上一篇下一篇

猜你喜欢

热点阅读