Redis几种序列化方式分析

概括

一般redis的序列化方式主要有:字符串序列化、json序列化、jdk序列化,具体可查阅org.springframework.data.redis.serializer.RedisSerializer 的实现类,其中对于json序列化,官方实现的是jackson的序列化,此外fastjson也有对应的实现。

代码展示

下面开始展示string类型生成50000条user的源代码。

/**
	 * @Title: testCreateUserByJDK 
	 * @Description: 通过JDK序列化
	 * @return: void
	 */
	@Test
	public void testCreateUserByJDK() {
		List<User> users = new ArrayList<>();
		String[] sexs = { "男", "女" };
		String[] emails = { "@qq.com", "@163.com", "@sian.com", "@gmail.com", "@sohu.com",
				"@hotmail.com", "@foxmail.com" };
		for (int i = 1; i <= 50000; i++) {
			User user = new User();
			// (1)ID使用1-5万的顺序号。(2分)
			user.setId(i);
			// (2)姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法。(4分)
			user.setName(StringUtil.generateChineseName().substring(0, 2)
					+ StringUtil.randomChineseString());
			// (3)性别在女和男两个值中随机。(4分)
			user.setSex(sexs[RandomUtil.random(0, 1)]);
			// (4)手机以13开头+9位随机数模拟。(4分)
			user.setTel("13" + RandomUtil.randomNumber(9));
			// (5)邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com |
			// @hotmail.com | @foxmail.com模拟。(4分)
			user.setEmail(util.randomString(RandomUtil.random(3, 20))
					+ emails[RandomUtil.random(0, emails.length - 1)]);
			// (6)生日要模拟18-70岁之间,即日期从1949年到2001年之间。(4分)
			user.setBirthday(DateUtil.randomDate("1949-01-01", "2001-01-01", 0));
			System.out.println(user);
			users.add(user);
		}
		ListOperations<String, User> opsForList = redisTemplate.opsForList();
		long s1 = System.currentTimeMillis();
		opsForList.leftPushAll("user_list_jdk", users);
		long e1 = System.currentTimeMillis();
		String msg = "系列化方式:JDK序列化\n保存数量:50000条\n所耗时间:" + (e1 - s1) + "毫秒";
		//储存在txt文本中
		StreamUtil.Write2File(
				"E:\\eclipse_Linux\\caoyuan-redis-test\\src\\test\\resources\\msg.txt",
				msg);
		System.out.println(msg);
	}

key、value的jdk序列化方式如下:

<!-- jdk序列化 -->
		<property name="valueSerializer">
			<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
		</property>

优势和劣势:

系列化方式:JDK序列化
保存数量:50000条
所耗时间:1656毫秒

使用redis的list类型存储和使用jdk方式序列化
缺点
耗时长,值经过jdk序列化,会看着像乱码,可读性差
优点
默认序列化格式,不用配置就是这个

key、value的json序列化方式的java代码和上边的一样:

<!-- json序列化 -->
		<property name="valueSerializer">
			<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
		</property>

优势和劣势:

系列化方式:JSON序列化
保存数量:50000条
所耗时间:712毫秒

使用redis的list类型存储和使用JSON方式序列化
缺点
比hash类型储存的耗时长点
优点
值经过json序列化,以键值对方式呈现,可读性好

hash类型储存的java代码:

/**
	 * @Title: testCreateUserByHash 
	 * @Description: 通过hash创建,其中key和value都通过string序列化
	 * @return: void
	 */
	@Test
	public void testCreateUserByHash() {
		Map<String, String> users = new HashMap<>();
		String[] sexs = { "男", "女" };
		String[] emails = { "@qq.com", "@163.com", "@sian.com", "@gmail.com", "@sohu.com",
				"@hotmail.com", "@foxmail.com" };
		for (int i = 1; i <= 50000; i++) {
			User user = new User();
			// (1)ID使用1-5万的顺序号。(2分)
			user.setId(i);
			// (2)姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法。(4分)
			user.setName(StringUtil.generateChineseName().substring(0, 2)
					+ StringUtil.randomChineseString());
			// (3)性别在女和男两个值中随机。(4分)
			user.setSex(sexs[RandomUtil.random(0, 1)]);
			// (4)手机以13开头+9位随机数模拟。(4分)
			user.setTel("13" + RandomUtil.randomNumber(9));
			// (5)邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com |
			// @hotmail.com | @foxmail.com模拟。(4分)
			user.setEmail(util.randomString(RandomUtil.random(3, 20))
					+ emails[RandomUtil.random(0, emails.length - 1)]);
			// (6)生日要模拟18-70岁之间,即日期从1949年到2001年之间。(4分)
			user.setBirthday(DateUtil.randomDate("1949-01-01", "2001-01-01", 0));
			System.out.println(user);
			users.put(i+"", user.toString());
		}
		HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash();
		long s1 = System.currentTimeMillis();
		opsForHash.putAll("user_hash_string", users);
		long e1 = System.currentTimeMillis();
		String msg = "系列化方式:string序列化\n保存数量:50000条\n所耗时间:" + (e1 - s1) + "毫秒";
		//储存在txt文本中
		StreamUtil.Write2File(
				"E:\\eclipse_Linux\\caoyuan-redis-test\\src\\test\\resources\\msg3.txt",
				msg);
		System.out.println(msg);
	}

hash类型的字符串序列化配置:

<!-- hash值string序列化 -->
		<property name="hashValueSerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>

优势和劣势:

系列化方式:string序列化
保存数量:50000条
所耗时间:408毫秒

使用redis的hash类型存储和使用string方式序列化
缺点
反序列化后是string格式,转化为对象十分麻烦
优点
耗时最短,string序列化后,可视化界面还是原样子
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值