测试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个随机字母 + @  | @ | @sian.com | @ | @sohu.com | @hotmail.com | @模拟。
			String str[]= {"@","@","@sian.com","@","@sohu.com","@hotmail.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毫秒

redis map 序列化问题 redis序列化性能_redis

使用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个随机字母 + @  | @ | @sian.com | @ | @sohu.com | @hotmail.com | @模拟。
			String str[]= {"@","@","@sian.com","@","@sohu.com","@hotmail.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毫秒

redis map 序列化问题 redis序列化性能_redis_02


总结: JDK自带的序列化方式、存储的字符串内容在序列化的情况下偏长,会占用过多的内存 使用JdkSerializationRedisSerializer序列化的Bean必须实现Serializable接口,在存储内容时,除了属性的内容外还存了其它内容在里面,长度长,且不易阅读

Jackson2JsonRedisSerializer:json数据格式、序列化时间和序列化之后内容的长度都要优于JdkSerializationRedisSerializer 且该序列化的结果清晰,容易阅读,而且存储字节少,速度快,推荐。