美文网首页
Unrecognized token 'redis': was

Unrecognized token 'redis': was

作者: syxyabc | 来源:发表于2018-09-28 11:04 被阅读0次

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

    相关文章

      网友评论

          本文标题:Unrecognized token 'redis': was

          本文链接:https://www.haomeiwen.com/subject/rdpuoftx.html