本文已参与「新人创作礼」活动,一起开启掘金创作之路。
redisTemplate序列化配置参数
- DefaultSerializer: 默认的序列化器
- KeySerializer :redis key的序列化器
- ValueSerializer: 非hash结构的value序列化器
- HashKeySerializer::hash结构的field序列化器
- HashValueSerializer:hash结构的value序列化器
- EnableDefaultSerializer:当序列化器为空的时候是否使用默认序列化器
序列化的几种方式
redisTemplate有很多种序列化方式:
第一种: JdkSerializationRedisSerializer 这种是redisTemplate默认的序列化方式
第二种:GenericJackson2JsonRedisSerializer
第三种:StringRedisSerializer 这是StringRedisTemplate的默认序列化方式, 只能存储String类型
第四种:Jackson2JsonRedisSerializer
第五种:FastJsonRedisSerializer
基本操作验证
存储
执行如下存储的测试代码
@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进制转义了的字符。
第二种:GenericJackson2JsonRedisSerializer
使用"@class"标明java类的信息
第三种:StringRedisSerializer
这是StringRedisTemplate的默认序列化方式, 由于只能存储String类型,执行报错
第四种:Jackson2JsonRedisSerializer
最外层还有一个数组结构,比其他方式层级更多
第五种:FastJsonRedisSerializer
redis里面存储的结构最简单纯粹
读取
原字段读取
都是正常读取。
JavaBean少一个字段
大部分序列化方式都报错了,只有FastJsonRedisSerializer 正常(返回的是JSONObject对象)
JavaBean 多一个字段
大部分都是正常的,JdkSerializationRedisSerializer报错。
StringRedisSerializer注意点
- 如果采用StringRedisSerializer序列化方式,redisTemplate不能直接存储非String类型的数据,否则会报错"XX cannot cast to java.lang.String"。
- 但是可以执行incr操作,并且incr操作返回值也可以是数值型。
- get操作得到的数据是char数据(char[]),如果想要get取出数值型value,需要通过String转换一下。