第二周周考
JAVA 操纵Redis系列化性能
随机生成数据
使用JDK系列化方式保存5万条数据
jdk的配置文件
<!-- jdk序列化 -->
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
运行代码
@Test
public void testJDK() {
long t1 = System.currentTimeMillis();
for (int i = 0; i < 50000; i++) {
User u = new User();
u.setId(i);
// 随机生成姓名
u.setName(StringUtil.generateChineseName());
// 随机生成性别
u.setGender(UserUtils.getSex());
// 随机生成13开头的号码
u.setPhone("13" + RandomUtil.randomNumber(9));
// 随机生成邮箱
u.setEmail(UserUtils.getMail());
// 随机生成生日
u.setBirthday(UserUtils.getBirthday());
redisTemplate.opsForList().leftPushAll("user_jdk", u);
}
long t2 = System.currentTimeMillis();
System.out.println("使用的是jdk的序列化方式");
System.out.println("共保存了50000条数据");
System.out.println("总时间" + (t2 - t1));
}
运行结果
使用JSON系列化方式保存5万条数据
配置文件
<!-- json序列化 -->
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>
运行代码
@Test
public void testJSON() {
long t1 = System.currentTimeMillis();
for (int i = 0; i < 50000; i++) {
User u = new User();
u.setId(i);
// 随机生成姓名
u.setName(StringUtil.generateChineseName());
// 随机生成性别
u.setGender(UserUtils.getSex());
// 随机生成13开头的号码
u.setPhone("13" + RandomUtil.randomNumber(9));
// 随机生成邮箱
u.setEmail(UserUtils.getMail());
// 随机生成生日
u.setBirthday(UserUtils.getBirthday());
redisTemplate.opsForList().leftPushAll("user_json", u);
}
long t2 = System.currentTimeMillis();
System.out.println("使用的是jdk的序列化方式");
System.out.println("共保存了50000条数据");
System.out.println("总时间" + (t2 - t1));
}
运行结果
利用hash类型保存5万条数据
配置文件
<!-- hash小键的序列化 -->
<property name="hashKeySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<!-- hash值jdk序列化 -->
<!-- <property name="hashValueSerializer">
<bean
class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property> -->
<!-- hash值json序列化 -->
<property name="hashValueSerializer">
<bean
class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>
运行代码
@Test
public void testHash() {
long t1 = System.currentTimeMillis();
HashMap<String, User> map = new HashMap<String, User>();
for (int i = 0; i < 50000; i++) {
User u = new User();
u.setId(i);
// 随机生成姓名
u.setName(StringUtil.generateChineseName());
// 随机生成性别
u.setGender(UserUtils.getSex());
// 随机生成13开头的号码
u.setPhone("13" + RandomUtil.randomNumber(9));
// 随机生成邮箱
u.setEmail(UserUtils.getMail());
// 随机生成生日
u.setBirthday(UserUtils.getBirthday());
map.put(i + "", u);
redisTemplate.opsForHash().put("users"+i, "user"+i, u.toString());
}
redisTemplate.opsForHash().putAll("user_hash", map);
long t2 = System.currentTimeMillis();
System.out.println("使用的是jdk的序列化方式");
System.out.println("共保存了50000条数据");
System.out.println("总时间" + (t2 - t1));
}
运行结果
测试结果
用JDK方法存入redis使用时间为13361s
已成功存入JDK方法50000条redis数据
用JSON方法存入redis使用时间为11915s
已成功存入JSON方法50000条redis数据
用Hash方法存入redis使用时间为27997s
已成功存入Hash方法50000条redis数据
总结:每个方法最少运行两次 JSON最快 hash最慢