我们使用RedisTemplate从Redis缓存中获取所有密钥 . 我们使用“扫描”来获取所有密钥 . 我们不直接使用Lettuce或Jedis,我们让RedisTemplate来做 .

当我们将RedisTemplate配置为使用Lettuce时,scan命令将返回所有键 . 当我们将RedisTemplate配置为使用Jedis时,出现了问题,我们看到以下异常:

05-20@22:40:01 ERROR ( MyCache.java:58)     - Exception
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:82)
    at test.MyCache.deserializeKeys(MyCache.java:70)
    at test.MyCache.getKeys(MyCache.java:52)
    at test.RedisApp.main(RedisApp.java:54)
Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:78)
    at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:36)
    at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:80)
    ... 3 more
Caused by: java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:301)
    at org.springframework.core.ConfigurableObjectInputStream.<init>(ConfigurableObjectInputStream.java:63)
    at org.springframework.core.ConfigurableObjectInputStream.<init>(ConfigurableObjectInputStream.java:49)
    at org.springframework.core.serializer.DefaultDeserializer.deserialize(DefaultDeserializer.java:68)
    at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:73)
    ... 5 more

我们想用一个完整的例子说明问题,所以我们在GitHub https://github.com/michaelweber2/redis-app上创建了一个示例项目 . 该项目使用Java 8,Maven(3),Spring Data Redis(1.8.3.RELEASE),Lettuce(4.3.1.Final)和Jedis(2.9.0) . 该项目已使用Redis服务器3.2.9进行了测试 .

所以问题是为什么我们只有在配置RedisTemplate以使用Jedis时才能获得此Exception,以及我们可以做些什么来使Jedis工作?