java中使用redistemplate向redis中存储自定义对象,以及该如何取出,取值时保持错invalid stream header: 00000000
时间: 2024-09-12 16:07:06 浏览: 54
在Java中,使用Spring Data Redis的`RediTemplate`可以方便地将自定义对象存储到Redis中。首先,你需要做的是序列化和反序列化的配置:
1. **定义自定义对象和序列化**:
如果你的自定义对象实现了`Serializable`接口,Spring Data Redis会自动处理序列化。如果需要更细粒度控制,你可以选择使用Jackson、Hession或者其他序列化库,并配置`Jackson2JsonRedisSerializer`或自定义`ObjectMapper`。
```java
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
public class CustomObjectSerializer implements RedisSerializer<CustomObject> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public byte[] serialize(CustomObject object, RedisSerializer<Object> serializer) {
try {
return objectMapper.writeValueAsBytes(object);
} catch (Exception e) {
throw new SerializationFailedException("Error serializing", e);
}
}
@Override
public CustomObject deserialize(byte[] bytes, RedisSerializer<Object> serializer) {
try {
return objectMapper.readValue(bytes, CustomObject.class);
} catch (Exception e) {
throw new DeserializationFailedException("Error deserializing", e);
}
}
}
```
2. **使用RediTemplate存储和检索**:
配置`RedisTemplate`并设置序列化器:
```java
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private CustomObjectSerializer customObjectSerializer;
stringRedisTemplate.setValueSerializer(customObjectSerializer);
stringRedisTemplate.afterPropertiesSet();
```
然后,你可以这样存储和取出自定义对象:
```java
// 存储
CustomObject obj = ...;
stringRedisTemplate.opsForValue().set("key", obj);
// 取出
byte[] serializedObj = stringRedisTemplate.opsForValue().get("key");
CustomObject retrievedObj = customObjectSerializer.deserialize(serializedObj, CustomObject.class);
```
关于错误信息 `invalid stream header: 00000000`,这通常表示从Redis读取的数据头与预期格式不符。可能是序列化或反序列化的错误,或者是网络问题导致数据传输过程中发生了损坏。检查序列化/反序列化过程,确认数据是否完整,以及网络连接是否稳定。如果问题持续存在,可能需要进一步分析日志或使用Redis的命令行工具验证数据。
阅读全文