zoukankan      html  css  js  c++  java
  • Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer的区别

    Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer的区别

    一、使用Jackson2JsonRedisSerializer序列化反序列化带泛型的List数据

    1、使用Jackson2JsonRedisSerializer序列化value的代码:

    RedisTemplate<Object, Object> template = new RedisTemplate<Object,Object>();
    
    template.setKeySerializer(new StringRedisSerializer());
    
    template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
    
    UserToken userToken = new UserToken();
    
    userToken.setMobile("176****6708");
    
    List<UserToken> list = Lists.newArrayList(userToken);
    
    redisTemplate.opsForValue().set("test",list,5,TimeUnit.MINUTES);
    

    2、使用Jackson2JsonRedisSerializer序列化后的数据形式:

    img

    3、使用Jackson2JsonRedisSerializer反序列化时报错

    List<UserToken> list2 = (List<UserToken>)redisTemplate.opsForValue().get("test");
    list2.forEach(userToken1 -> System.out.println(userToken1.getMobile()));
    java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.com.baisq.model.UserToken
    

    原因:序列化带泛型的数据时,会以map的结构进行存储,反序列化是不能将map解析成对象。

    4、解决方案:序列化存储时,转成JSON字符串

    UserToken userToken = new UserToken();
    
    userToken.setMobile("176****6708");
    
    List<UserToken> list = Lists.newArrayList(userToken);
    
    redisTemplate.opsForValue().set("test3", JSON.toJSONString(userToken),5,TimeUnit.MINUTES);
    
    String list2 = (String)redisTemplate.opsForValue().get("test3");
    
    JSON.parseArray(list2,UserToken.class).forEach(userToken1 -> System.out.println(userToken1.getMobile()));
    

    二、使用GenericJackson2JsonRedisSerializer序列化反序列化带泛型的List数据

    1、使用GenericJackson2JsonRedisSerializer序列化value的代码:

    RedisTemplate<Object, Object> template = new RedisTemplate<Object,Object>();
    
    template.setKeySerializer(new StringRedisSerializer());
    
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
    UserToken userToken = new UserToken();
    
    userToken.setMobile("176****6708");
    
    List<UserToken> list = Lists.newArrayList(userToken);
    
    redisTemplate.opsForValue().set("test2",list,5,TimeUnit.MINUTES);
    

    2、使用GenericJackson2JsonRedisSerializer序列化后的数据形式:

    img

    3、使用GenericJackson2JsonRedisSerializer可以正常反序列化

    List<UserToken> list2 = (List<UserToken>)redisTemplate.opsForValue().get("test2");
    list2.forEach(userToken1 -> System.out.println(userToken1.getMobile()));
    

    4、原因:

    使用GenericJackson2JsonRedisSerializer序列化时,会保存序列化的对象的包名和类名,反序列化时以这个作为标示就可以反序列化成指定的对象。

    5、也可以以JSON字符串保存:

    UserToken userToken = new UserToken();
    
    userToken.setMobile("176****6708");
    
    List<UserToken> list = Lists.newArrayList(userToken);
    
        redisTemplate.opsForValue().set("test4",JSON.toJSONString(userToken),5,TimeUnit.MINUTES);
    
    String list2 = (String)redisTemplate.opsForValue().get("test4");
    
    JSON.parseArray(list2,UserToken.class).forEach(userToken1 -> System.out.println(userToken1.getMobile()));
    

    三、使用GenericJackson2JsonRedisSerializer和Jackson2JsonRedisSerializer都可以正常序列化反序列化非泛型数组对象。

    四、GenericJackson2JsonRedisSerializer和Jackson2JsonRedisSerializerdo效率:

    long start  = System.currentTimeMillis();
    
    UserToken userToken = new UserToken();
    
    userToken.setMobile("176****6708");
    
    List<UserToken> list = Lists.newArrayListWithCapacity(100);
    
    for (int i = 0; i < 1000; i++) {
    
       list.add(userToken);
    
    }
    
    redisTemplate.opsForValue().set("test",JSON.toJSONString(list),5,TimeUnit.MINUTES);
    
    String data = (String)redisTemplate.opsForValue().get("test");
    
    List<UserToken> list2 = JSON.parseArray(data, UserToken.class);
    
    long end = System.currentTimeMillis();
    
    long time = end - start;
    

    测试后:

    使用GenericJacksonRedisSerializer序列化反序列化耗时:1467

    使用Jackson2JsonRedisSerializer序列化反序列化耗时:914

    五、总结

    1、使用Jackson2JsonRedisSerializer需要指明序列化的类Class,可以使用Obejct.class

    2、使用GenericJacksonRedisSerializer比Jackson2JsonRedisSerializer效率低,占用内存高。

    3、Jackson2JsonRedisSerializer反序列化带泛型的数组类会报转换异常,解决办法存储以JSON字符串存储。

    4、GenericJacksonRedisSerializer和Jackson2JsonRedisSerializer都是以JSON格式去存储数据,都可以作为Redis的序列化方式。
    ---------------------
    作者:baisq2017
    来源:CSDN
    原文:https://blog.csdn.net/bai_bug/article/details/81222519
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    格式化数字,将字符串格式的数字,如:1000000 改为 1 000 000 这种展示方式
    jquery图片裁剪插件
    前端开发采坑之安卓和ios的兼容问题
    页面消息提示,上下滚动
    可以使用css的方式让input不能输入文字吗?
    智慧农村“三网合一”云平台测绘 大数据 农业 信息平台 应急
    三维虚拟城市平台测绘 大数据 规划 三维 信息平台 智慧城市
    农业大数据“一张图”平台测绘 大数据 房产 国土 农业 信息平台
    应急管理管理局安全生产预警平台应急管理系统不动产登记 测绘 大数据 规划 科教 三维 信息平台
    地下综合管廊管理平台测绘 大数据 地下管线 三维 信息平台
  • 原文地址:https://www.cnblogs.com/nieaojie625/p/13772906.html
Copyright © 2011-2022 走看看