java中使用redistemplate向redis中存储中文字符串,以及该如何取出,取值时保持错invalid stream header: 00000000
时间: 2024-09-11 08:17:57 浏览: 44
在Java中使用JedisTemplate操作Redis存储和读取中文字符串通常不会遇到直接的问题,因为Redis本身支持序列化多种数据类型,包括String。当你需要存储中文字符串时,可以这样做:
```java
@Autowired
private JedisConnectionFactory jedisConnectionFactory;
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void saveChineseString(String key, String chineseString) {
try (Jedis jedis = jedisConnectionFactory.getConnection()) {
// 将中文字符串转换为Byte[]再存储,Redis默认序列化方式为JdkSerialization
byte[] bytes = chineseString.getBytes(StandardCharsets.UTF_8);
redisTemplate.opsForValue().set(key, bytes);
}
}
// 取出时同样使用Byte[]形式
public String getChineseStringFromRedis(String key) {
try (Jedis jedis = jedisConnectionFactory.getConnection()) {
byte[] bytes = redisTemplate.opsForValue().get(key);
return new String(bytes, StandardCharsets.UTF_8);
} catch (Exception e) {
// 如果这里捕获到异常,可能是序列化错误,比如"invalid stream header: 00000000"
if (e.getMessage().contains("invalid stream")) {
log.error("Error deserializing from Redis", e);
throw new RuntimeException("Invalid data retrieved from Redis.", e);
}
// 其他错误处理...
}
}
```
如果在`getChineseStringFromRedis`方法中遇到`invalid stream header`这样的错误,那通常是序列化反序列化的过程中发生了问题。这可能是因为存储时的数据格式不符合预期,或者Redis配置了非默认的序列化策略。检查一下Redis的配置,确认是否正确设置了序列化插件(如Jackson或Hessian等),并确保所有操作都在UTF-8编码下进行。
阅读全文