Spring RedisTemplate序列化方式

1,199 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


redisTemplate序列化配置参数

image.png

  • DefaultSerializer: 默认的序列化器
  • KeySerializer :redis key的序列化器
  • ValueSerializer: 非hash结构的value序列化器
  • HashKeySerializer::hash结构的field序列化器
  • HashValueSerializer:hash结构的value序列化器
  • EnableDefaultSerializer:当序列化器为空的时候是否使用默认序列化器

序列化的几种方式

redisTemplate有很多种序列化方式:

第一种: JdkSerializationRedisSerializer 这种是redisTemplate默认的序列化方式

image.png

image.png

第二种:GenericJackson2JsonRedisSerializer

image.png

第三种:StringRedisSerializer 这是StringRedisTemplate的默认序列化方式, 只能存储String类型

image.png

第四种:Jackson2JsonRedisSerializer

image.png

第五种:FastJsonRedisSerializer

image.png

基本操作验证

存储

执行如下存储的测试代码

    @Autowired
    @Qualifier("redisGenericJackson2JsonRedisSerializer")
    private RedisTemplate redisTemplateGenericJackson2JsonRedisSerializer;

    @Test
    public void testGenericJackson2JsonRedisSerializer(){
        UserInfo userInfo = new UserInfo(1,"张三","010-6855538");
        redisTemplateGenericJackson2JsonRedisSerializer.opsForValue().set("testSerializer:testGenericJackson2JsonRedisSerializer",userInfo);
        redisTemplateGenericJackson2JsonRedisSerializer.opsForValue().set("testSerializer:list:testGenericJackson2JsonRedisSerializer",Arrays.asList(userInfo));
    }

    @Autowired
    @Qualifier("redisStringRedisSerializer")
    private RedisTemplate redisTemplateStringRedisSerializer;

    @Test
    public void testStringRedisSerializer(){
        UserInfo userInfo = new UserInfo(1,"张三","010-6855538");
        redisTemplateStringRedisSerializer.opsForValue().set("testSerializer:testStringRedisSerializer",userInfo);
        redisTemplateStringRedisSerializer.opsForValue().set("testSerializer:list:testStringRedisSerializer",Arrays.asList(userInfo));
    }

    @Autowired
    @Qualifier("redisJdkSerializationRedisSerializer")
    private RedisTemplate redisTemplateJdkSerializationRedisSerializer;

    @Test
    public void testJdkSerializationRedisSerializer(){
        UserInfo userInfo = new UserInfo(1,"张三","010-6855538");
        redisTemplateJdkSerializationRedisSerializer.opsForValue().set("testSerializer:testJdkSerializationRedisSerializer",userInfo);
        redisTemplateJdkSerializationRedisSerializer.opsForValue().set("testSerializer:list:testJdkSerializationRedisSerializer",Arrays.asList(userInfo));
    }

    @Autowired
    @Qualifier("redisJackson2JsonRedisSerializer")
    private RedisTemplate redisTemplateJackson2JsonRedisSerializer;

    @Test
    public void testJackson2JsonRedisSerializer(){
        UserInfo userInfo = new UserInfo(1,"张三","010-6855538");
        redisTemplateJackson2JsonRedisSerializer.opsForValue().set("testSerializer:testJackson2JsonRedisSerializer",userInfo);
        redisTemplateJackson2JsonRedisSerializer.opsForValue().set("testSerializer:list:testJackson2JsonRedisSerializer",Arrays.asList(userInfo));
    }

    @Autowired
    @Qualifier("redisFastJsonRedisSerializer")
    private RedisTemplate redisTemplateFastJsonRedisSerializer;

    @Test
    public void testFastJsonRedisSerializer(){
        UserInfo userInfo = new UserInfo(1,"张三","010-6855538");
        redisTemplateFastJsonRedisSerializer.opsForValue().set("testSerializer:testFastJsonRedisSerializer",userInfo);
        redisTemplateFastJsonRedisSerializer.opsForValue().set("testSerializer:list:testFastJsonRedisSerializer",Arrays.asList(userInfo));
    }

    }

第一种: JdkSerializationRedisSerializer

这种是redisTemplate默认的序列化方式,存储的是16进制转义了的字符。

image.png

第二种:GenericJackson2JsonRedisSerializer

使用"@class"标明java类的信息

image.png

第三种:StringRedisSerializer

这是StringRedisTemplate的默认序列化方式, 由于只能存储String类型,执行报错

image.png

第四种:Jackson2JsonRedisSerializer

最外层还有一个数组结构,比其他方式层级更多

image.png

第五种:FastJsonRedisSerializer

redis里面存储的结构最简单纯粹

image.png

读取

原字段读取

image.png

都是正常读取。

JavaBean少一个字段

image.png

image.png

大部分序列化方式都报错了,只有FastJsonRedisSerializer 正常(返回的是JSONObject对象)

JavaBean 多一个字段

image.png

image.png

大部分都是正常的,JdkSerializationRedisSerializer报错。

StringRedisSerializer注意点

image.png

  • 如果采用StringRedisSerializer序列化方式,redisTemplate不能直接存储非String类型的数据,否则会报错"XX cannot cast to java.lang.String"。

image.png

  • 但是可以执行incr操作,并且incr操作返回值也可以是数值型。

image.png

  • get操作得到的数据是char数据(char[]),如果想要get取出数值型value,需要通过String转换一下。