测试Java操纵Redis序列化性能。

测试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 且该序列化的结果清晰,容易阅读,而且存储字节少,速度快,推荐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值