listData = //数据;SessionCallback callback = new SessionCallback() { ..._redistemplate.opsforlist().rang获取值问题 是jsonarray">
赞
踩
在项目中中使用RedisTemplate序列化对象存储时,将转义字符""也存到redis里面,再次取出时,转成对象失败。据同事说是序列化方式不一致导致的。在此记录一下,也感谢一下同事的帮助。
在此之前看一下存入的代码:
List<String> listData = //数据;
SessionCallback callback = new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
operations.multi();
operations.boundHashOps(getAllMapeKey()).putAll(mapData); operations.boundListOps(geAlltKey()).leftPushAll(array);
return operations.exec();
}
};
try {
SpringContextUtils.getBean(RedisTemplate.class).execute(callback);
notificationMapCurrent.clear();
} catch (Exception e) {
logger.error("保存数据至redis失败,", e);
}
这样
SpringContextUtils.getBean(RedisTemplate.class).execute(callback);
执行之后保存到redis里面的数据是
"{\"infoIds\":\"220191216210101161250616126\",\"Time\":1576501218000}"
这样的数据取出来时的string就保持了原样,
使用一下方式获取:
@Autowired
private RedisTemplate<String,String> redisTemplate;
BoundHashOperations<String, String, String> boundHashOperations = redisTemplate.boundHashOps(getAllMapeKey());
将去到的string数据转换为对象,就会导致直接转换成json是报错:
com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62
但是,如果使用的是StringRedisTemplate就可以。
SpringContextUtils.getBean(StringRedisTemplate.class).execute(callback);
执行之后保存到redis里面的数据是:
{"infoIds":"220191216210101161250616126","Time":1576501218000}"
至于原因可能是,RedisTemplate和StringRedisTemplate序列化范式不一样导致的:
RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化对象,可以用来存储对象,但是要实现Serializable接口。
StringRedisTemplate使用的是 StringRedisSerializer 序列化String,StringRedisTemplate 主要用来存储字符串,StringRedisSerializer的泛型指定的是String。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。