gpt4 book ai didi

spring-data-redis redisTemplate 异常

转载 作者:IT王子 更新时间:2023-10-29 05:58:42 26 4
gpt4 key购买 nike

当我调用get()方法时,发生异常

这是代码

@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 方法时,没有异常,只有错误只有 get 方法





这是堆栈跟踪 ---

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 中看起来像这样:

"\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”的结果会经过反序列化过程,该过程需要类似上述的格式。

您可以通过在 RedisTemplate 上使用不同的值序列化程序来解决此问题:

redisTemplate.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));

或者试试spring-data-redis自带的RedisAtomicLong类。

关于spring-data-redis redisTemplate 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com