测试Java操纵Redis序列化性能。
spring-data-redis的序列化类如下:
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象
StringRedisSerializer: 简单的字符串序列化
下面着重测试JdkSerializationRedisSerializer Jackson2JsonRedisSerializer 两种序列化方式
通过写入5万条数据比较两种的性能
使用JdkSerializationRedisSerializer序列化
<!--redis操作模版,使用该对象可以操作redis -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
<property name="connectionFactory" ref="jedisConnectionFactory" />
<!-- key序列化器StringRedisSerializer。 -->
<property name="keySerializer" >
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<!-- value序列化器为JdkSerializationRedisSerializer -->
<property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-redis.xml")
public class UserTest {
@Resource
private RedisTemplate<String, User> redisTemplate;
/**
*
* @Title: testJDK
* @Description: JDK序列化方式存储5万条数据
* @return: void
*/
@Test
public void testJDK() {
ListOperations<String, User> opsForList = redisTemplate.opsForList();
long start = System.currentTimeMillis();
for (int i = 1; i <= 50000; i++) {
User user = new User();
//(1) ID使用1-5万的顺序号
user.setId(i);
//(2) 姓名使用3个随机汉字模拟
user.setName(StringUtil.randomChineseString(3));
//(3) 性别在女和男两个值中随机。
String gender[]= {"男","女"};
user.setGender(gender[RandomUtil.random(0, 1)]);
//(4) 手机以13开头+9位随机数模拟
user.setTell("13"+RandomUtil.randomNumber(9));
//(5) 邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com | @hotmail.com | @foxmail.com模拟。
String str[]= {"@qq.com","@163.com","@sian.com","@gmail.com","@sohu.com","@hotmail.com","@foxmail.com"};
user.setEmail(RandomUtil.randomStringABC(RandomUtil.random(3, 20))+str[RandomUtil.random(0, str.length-1)]);
//(6) 生日要模拟18-70岁之间,即日期从1949年到2001年之间。
user.setBirthday(DateUtil.randomDate("1949-01-01", "2001-12-30"));
opsForList.leftPush("users_JDK"+i, user);
}
long end = System.currentTimeMillis();
System.out.println("序列化方式:JDK;保存数量:50000;所耗时间:"+(end-start)+"毫秒");
}
}
------------------------------------------------------------------------------------------------------------------------------
输出结果:序列化方式:JDK;保存数量:50000;所耗时间:5331毫秒
使用Jackson2JsonRedisSerializer方式
<!--redis操作模版,使用该对象可以操作redis -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
<property name="connectionFactory" ref="jedisConnectionFactory" />
<!-- key序列化器StringRedisSerializer。 -->
<property name="keySerializer" >
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<!-- value序列化器为Jackson2JsonRedisSerializer。 -->
<property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer">
<constructor-arg value="java.lang.Object"></constructor-arg>
</bean>
</property>
/**
*
* @Title: testJSON
* @Description: JSON序列化方式存储5万条数据
* @return: void
*/
@Test
public void testJSON() {
ListOperations<String, User> opsForList = redisTemplate.opsForList();
long start = System.currentTimeMillis();
for (int i = 1; i <= 50000; i++) {
User user = new User();
//(1) ID使用1-5万的顺序号
user.setId(i);
//(2) 姓名使用3个随机汉字模拟
user.setName(StringUtil.randomChineseString(3));
//(3) 性别在女和男两个值中随机。
String gender[]= {"男","女"};
user.setGender(gender[RandomUtil.random(0, 1)]);
//(4) 手机以13开头+9位随机数模拟
user.setTell("13"+RandomUtil.randomNumber(9));
//(5) 邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com | @hotmail.com | @foxmail.com模拟。
String str[]= {"@qq.com","@163.com","@sian.com","@gmail.com","@sohu.com","@hotmail.com","@foxmail.com"};
String abc= "qwertyuiopasdfghjklzxcvbnm";
user.setEmail(abc.charAt(RandomUtil.random(0, abc.length()-1))+str[RandomUtil.random(0, str.length-1)]);
//(6) 生日要模拟18-70岁之间,即日期从1949年到2001年之间。
user.setBirthday(DateUtil.randomDate("1949-01-01", "2001-12-30"));
opsForList.leftPush("users_JSON"+i, user);
}
long end = System.currentTimeMillis();
System.out.println("序列化方式:JSON;保存数量:5000;所耗时间:"+(end-start)+"毫秒");
}
--------------------------------------------------------------------------------------------------------------------------
输出结果:序列化方式:JSON;保存数量:5000;所耗时间:4807毫秒
总结: JDK自带的序列化方式、存储的字符串内容在序列化的情况下偏长,会占用过多的内存 使用JdkSerializationRedisSerializer序列化的Bean必须实现Serializable接口,在存储内容时,除了属性的内容外还存了其它内容在里面,长度长,且不易阅读
Jackson2JsonRedisSerializer:json数据格式、序列化时间和序列化之后内容的长度都要优于JdkSerializationRedisSerializer 且该序列化的结果清晰,容易阅读,而且存储字节少,速度快,推荐。