springboot整合redis,怎么配置才能支持多种数据类型的解析?

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String

》》》》》》》》》》》》》》》》》》》》》》》》
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized token 'PersonModel': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

如图,以两张图为一组,对应redisTemplate配置不同而出现的不同结果。配置是从百度那里拿来用的。
从控制台结果来看,似乎对redisTemplate.setValueSerializer()设置不同的值,可以支持解析不同的数据类型。有没有一种配置可以支持全部数据类型的解析?如果没有,那么是每次用之前,根据要操作的数据类型做一次设置吗?

另外问句题外话,springboot现在主流的、操作redis的工具是什么?redisTemplate?

请大神指教,谢谢~

阅读 1.9k
2 个回答

在配置类里事先定义好不同类型的redisTemplate的bean,如jdkRedisTemplate、stringRedisTemplate、jsonRedisTemplate,使用时指定bean即可。

目前工作中操作redis的常用组件就是redisson、redisTemplate

Spring在设计RedisTemplate的时候,就是设计的开箱即用的,让使用方不关心反序列化和序列化相关的操作,尽可能什么类型存进去,就什么类型拿出来,让使用方无感知,同时也是约定大于配置。

所以Spring默认使用了JdkSerializationRedisSerializer的序列化器。

现在网络上充斥着大量的水文,让大家对这个东西的使用变得很复杂,题主出现这个问题就是因为序列化和反序列化使用了String的序列化方式,但是使用又是任意类型的。

首先看RedisTemplate的类定义,类上是有泛型存在的,意味着,序列化方式如果与泛型兼容,就有两种:
1.全部存储为String,意味着容器里只有一个RedisTemplate<String,String>的类,所有使用的地方要手动转化
2.存储的序列化方式要带类型,意味着容器里的RedisTemplateRedisTemplate<?,?>支持任意类型

现在很多文章都是教大家存json,但是不存储类型,就导致需要存在N个RedisTemplate,每个类型对应一个Bean:
1.RedisTemplate<String,A>
2.RedisTemplate<String,B>
3.RedisTemplate<String,C>

正确用法是使用带类型的序列化方式,目前使用最多,默认提供的只有三种实现
1.GenericJackson2JsonRedisSerializer
2.JdkSerializationRedisSerializer
3.最后一个是fastjson,但是fastjson问题过多,高版本被Spring移除了,需要自己实现了

如果需要做到任意类型自动无缝转换,推荐使用GenericJackson2JsonRedisSerializer,且配置TypeResolverBuilderDefaultTyping.EVERYTHING

另外,SpringString类型准备的是StringRedisTemplate,不需要额外造任何轮子

题主需要确定自己RedisTemplate的配置,Spring默认是RedisAutoConfiguration,当前,使用Redisson会更完美

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题