listData = //数据;SessionCallback callback = new SessionCallback() { ..._redistemplate.opsforlist().rang获取值问题 是jsonarray">
当前位置:   article > 正文

RedisTemplate序列化存储的数据包含转移字符导致json转对象失败j_redistemplate.opsforlist().rang获取值问题 是jsonarray

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);
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这样

SpringContextUtils.getBean(RedisTemplate.class).execute(callback); 
  • 1

执行之后保存到redis里面的数据是

"{\"infoIds\":\"220191216210101161250616126\",\"Time\":1576501218000}"
  • 1

这样的数据取出来时的string就保持了原样,
使用一下方式获取:

@Autowired
private RedisTemplate<String,String> redisTemplate;
BoundHashOperations<String, String, String> boundHashOperations = redisTemplate.boundHashOps(getAllMapeKey());
  • 1
  • 2
  • 3

将去到的string数据转换为对象,就会导致直接转换成json是报错:

com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62
  • 1

但是,如果使用的是StringRedisTemplate就可以。

SpringContextUtils.getBean(StringRedisTemplate.class).execute(callback); 
  • 1

执行之后保存到redis里面的数据是:

{"infoIds":"220191216210101161250616126","Time":1576501218000}"
  • 1

至于原因可能是,RedisTemplate和StringRedisTemplate序列化范式不一样导致的:

RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化对象,可以用来存储对象,但是要实现Serializable接口。

StringRedisTemplate使用的是 StringRedisSerializer 序列化String,StringRedisTemplate 主要用来存储字符串,StringRedisSerializer的泛型指定的是String。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/715816
推荐阅读
相关标签
  

闽ICP备14008679号