从Java数据序列化–>redis数据序列化(重点哦)
Java数据序列化参考:https://blog.youkuaiyun.com/kali_Ma/article/details/121973144
redis数据序列化参考(重要!):https://blog.youkuaiyun.com/weixin_46008204/article/details/103507231
java数据序列化
- 将对象转化成一个字节序列(二进制数据)的过程。
你先告诉我为什么要有序列化?
对象可以转化为可以传输,存储的对象
正常一个对象,只能存在于程序运行时,当程序运行结束了,对象就消失了,对象只在程序运行时存在
- 现在有个需求,我想把user对象(包含了名字,年龄,身高,简历信息)传给数据持久化的服务,这里使用redis(保存数据的服务)。
- 在没有lava类的序列化之前,我们需要创建一个json对象,然后把user对象信息填写到json里面,然后再把这个json传给redis—这样每次传输数据的时候,都要将对象先转为json的格式数据,再传输,这样不仅麻烦而且是在user里面属性不复杂的情况下,所以产生了实体类直接序列化的功能
- 在有了序列化之后,可以将user对象序列化为数据,直接发到redis上面,再反序列化,就可以得到user对象了,这样user类就可以传输了。
Redis数据序列化
项目中什么时候会使用到这个序列化??
这个问题很重要,你配置文件指定了固定的序列化方法,具体会在什么时候用呢?
就在最简单的opsForValue.set(“user”, user)操作里面!!!!!!
好好理解一下Java序列化,和redis实际项目中为什么直接put键值对的时候就用到了这个序列化方法!!!
那么什么时候会执行redis反序列化呢?
那不就是相应的取出redis.get(“user”)操作么,使用User类来接收这个redis存储的,当时User类转过去的序列化字符,就是反序列化过程!!!
下面介绍redis具体序列化的方法
https://blog.youkuaiyun.com/weixin_46008204/article/details/103507231!!!!
默认使用的是jdkSeriablizationRedisSerializer.
依赖dara-redis支持的几种序列化类,代表着不同的序列化方法,每种方法代表着具体进入redis里面保存的value的类型,是看不懂的二进制格式,还是最常用的json格式,还是String类型的格式
- JdkSerializationRedisSerializer
- 当redis.conf指定这种格式序列化的时候,使用redis可视化工具去redis里面查看数据的格式时,会发现保存的user对象变成了–看不懂的二进制格式—这里虽然我们不需要看懂,但是对于我们还是很不方便
- Jackson2JsonRedisSerializer
- redis里面保存的就是Json格式了,所以这个方法最推荐!
- StringRedisSerializer
- 看名字就知道redis里面保存的是String格式了,也不是很好
实际项目的redis.cong配置
https://blog.youkuaiyun.com/hotdust/article/details/52251148!!
先看上面文章,然后这个里面的配置其实没啥太大要求的,有想法的时候可以自己试试。
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setHashKeySerializer(redisSerializer);
// 设置value的序列化器
//使用Jackson 2,将对象序列化为JSON
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//json转对象类,不设置默认的会将json转成hashmap--> 就是反序列化的时候,将json变为map
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// json中会显示类型
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
this.redisTemplate=redisTemplate;
return redisTemplate;
}