redis序列化初探

Posted zhwc-5w4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis序列化初探相关的知识,希望对你有一定的参考价值。

下面要序列化的类:

package com.crossdomain.edu.apc.course.redis.entity;

import java.io.Serializable;

public class Student implements Serializable{

private static final long serialVersionUID = -1853666810651064075L;

private String name;

private String gender;

private int age;

 

 

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

 

序列化 的对象:

private Student stu=new Student();

stu.setAge(22);

stu.setName("lisi");

stu.setGender("mail");

JdkSerializationRedisSerializer

 

这种序列化方式是基于JavaSerializable,被序列化的对象必须实现这个接口。

使用方式:

template.setKeySerializer(new StringRedisSerializer());

 

Redis存储的:

序列化后是一串乱码:

"\xac\xed\x00\x05sr\x003com.crossdomain.edu.apc.course.redis.entity.Student\xe6Fs\xdb[6H\xf5\x02\x00\x03I\x00\x03ageL\x00\x06gendert\x00\x12Ljava/lang/String;L\x00\x04nameq\x00~\x00\x01xp\x00\x00\x00\x16t\x00\x04mailt\x00\x04lisi"

反序列化后是正常的对象,下面是浏览器访问的结果。

{"name":"lisi","gender":"mail","age":22}

 

Jackson2JsonRedisSerializer

使用方式如下:

template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Student.class));

序列化后redis中存储的是:

"{\"name\":\"lisi\",\"gender\":\"mail\",\"age\":22}"

就是一个json字符串。

浏览器一样可以访问到正确的结果。

GenericJackson2JsonRedisSerializer

使用方式:

template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

存储的序列化结果:

"{\"@class\":\"com.crossdomain.edu.apc.course.redis.entity.Student\",\"name\":\"lisi\",\"gender\":\"mail\",\"age\":22}"

这种方式和Jackson2Json相比,还把当前的class序列化进去了。

 

还可以这样,把class放在指定的属性上。

template.setValueSerializer(new GenericJackson2JsonRedisSerializer("abcd"));

"{\"abcd\":\"com.crossdomain.edu.apc.course.redis.entity.Student\",\"name\":\"lisi\",\"gender\":\"mail\",\"age\":22}"

 

OxmSerializer

这种序列化方式,一直没有实现成功!找了各种资料,最后从官网上了解到

public OxmSerializer()

Creates a new, uninitialized OxmSerializer.

Requires setMarshaller(Marshaller) and setUnmarshaller(Unmarshaller) to be set before this serializer can be used.

所以template.setValueSerializer(new OxmSerializer());这样用会报空指针异常。MarshallerUnmarshaller分别对应序列化和反序列化,不能为空。这两个东西到底怎么用,有待了解。

 

下面是官网的原话,表述这种序列化的方式:

Serializer adapter on top of Spring‘s O/X Mapping. Delegates serialization/deserialization to OXM Marshaller and Unmarshaller. Note: null objects are serialized as empty arrays and vice versa.

java Objectxml 转换的适配器。

 

这种序列化,以后有时间再研究吧!

总结:

StringRedisSerializer这种序列化太常见,也很简单,就没有写。

 

以下观点源于网上,经过测试我也认同:

上面三种序列化,Jdk的专门用于java的,速度很快,但从存储结果看,是最占用redis资源的,而且不能跨语言,只能用于java语言。
最省存储资源的Jackson2Json,相比还有跨语言的特点,只要支持json,都能转换成自己的数据。

这两种方式推荐使用!


以上是关于redis序列化初探的主要内容,如果未能解决你的问题,请参考以下文章

技术分享php反序列化漏洞初探

初探Newtonsoft.json

电影镜头数时间序列分析初探

RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查

RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查

时间序列预测初探:Kats,SARIMA,Prophet,deepAR 等