spring-data-redis redisTemplate异常 [英] spring-data-redis redisTemplate Exception
问题描述
当我调用get()方法时,发生了异常
When I call get() method, an exception occured
这是代码
@Service("RedisService")
public class RedisServiceImpl implements RedisService {
@Autowired
RedisTemplate<String, Long> redisTemplate;
@Override
public Long get(String key) {
return redisTemplate.opsForValue().get(key);
}
@Override
public Long incrBy(String key, long increment) {
return redisTemplate.opsForValue().increment(key, increment);
}
当我使用incrBy方法时,没有例外,只有错误才得到方法
这是堆栈跟踪---
when I use incrBy method, there are no exceptions but only errors only get method
here is the stacktrace ---
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at org.springframework.core.serializer.DefaultDeserializer.deserialize(DefaultDeserializer.java:38)
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:58)
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:1)
at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:40)
at org.springframework.data.redis.core.AbstractOperations.deserializeValue(AbstractOperations.java:198)
at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:50)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:162)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:133)
at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:84)
at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:42)
at net.daum.air21.bot.common.service.RedisServiceImpl.get(RedisServiceImpl.java:29)
at net.daum.air21.bot.user.service.SeraCoffeeServiceImpl.getCurrentCount(SeraCoffeeServiceImpl.java:41)
推荐答案
默认情况下,RedisTemplate使用JdkSerializationRedisSerializer,因此,如果您进行了设置",则会使Long在Redis中看起来像这样:
By default, RedisTemplate uses a JdkSerializationRedisSerializer, so if you did a "set" it would make your Long look something like this in Redis:
"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x00\x00\x00\x00\x04"
IncrBy之所以起作用,是因为Redis总是从该操作返回Long,因此RedisTemplate不会尝试对结果进行反序列化.但是,"get"的结果要经过反序列化过程,该过程需要像上面那样的格式.
IncrBy works because Redis always returns a Long from that operation, so RedisTemplate does not attempt to deserialize the result. The result of "get", however, goes through the deserialization process, which expects a format like the above.
您可以通过在RedisTemplate上使用其他值序列化器来解决此问题:
You can solve this by using a different value serializer on your RedisTemplate:
redisTemplate.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));
或者尝试使用spring-data-redis随附的RedisAtomicLong类.
Or try the RedisAtomicLong class that comes with spring-data-redis.
这篇关于spring-data-redis redisTemplate异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!