使用JDK系列化方式保存5万个user随机对象到Redis
JdkSerializationRedisSerializer是最高效的(毕竟是JDK原生的),但是是序列化的结果字符串是最长的。
系列化方式为JDK存储,保存数量为50000所耗时间:632ms。
使用JSON系列化方式保存5万个user随机对象到Redis
JSON由于其数据格式的紧凑性,序列化的长度是最小的,时间比前者要多一些。
系列化方式为JSON存储,保存数量为50000所耗时间:343ms。
使用Redis的Hash类型保存5万个user随机对象到Redis
系列化方式为Hash存储,保存数量为50000所耗时间:590ms。
将具有同一类规则的数据放到redis中的一个数据容器里,便于查找数据,
使用hash 省内存。在hash类型中,一个key可以对应多个多个field,一个field对应一个value。
@Resource
private RedisTemplate redisTemplate;
List<User> u = new ArrayList<User>();
@Test
public void test() {
for (int i = 1; i <= 50000; i++) {
//(1) ID使用1-5万的顺序号
Integer id = i;
//(2) 姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法
String name = StringUtil.randomChineseString(3);
//(3) 性别在女和男两个值中随机
String sex = StringUtil.randomSex();
//(4) 手机以13开头+9位随机数模拟
String iphone = "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 mailbox = RandomUtil.randomLenthChar(RandomUtil.random(3, 20)) + str[RandomUtil.random(0, str.length-1)];
//(6生日要模拟18-70岁之间,即日期从1949年到2001年之间
int birthday = RandomUtil.random(1949, 2001);
User user = new User(id, name,sex, iphone, mailbox, birthday);
u.add(user);
}
//存入redis,JDK方式
ListOperations<String,User> opsForList = redisTemplate.opsForList(); long
start = System.currentTimeMillis(); opsForList.leftPushAll("user_jdk", u);
long end = System.currentTimeMillis(); Long size =
opsForList.size("user_jdk");
System.out.println("系列化方式为JDK存储,保存数量为"+size+"所耗时间:"+(end-start));
//存入redis,JSON方式
ListOperations<String,User> opsForList1 = redisTemplate.opsForList(); long
start1 = System.currentTimeMillis(); opsForList1.leftPushAll("user_json", u);
long end1 = System.currentTimeMillis(); Long size1 =
opsForList1.size("user_json");
System.out.println("系列化方式为JSON存储,保存数量为"+size1+"所耗时间:"+(end1-start1));
}
@Test
public void HashTest() {
Map<String,User> hashMap = new HashMap<String,User>();
for (int i = 1; i <= 50000; i++) {
//(1) ID使用1-5万的顺序号
Integer id = i;
//(2) 姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法
String name = StringUtil.randomChineseString(3);
//(3) 性别在女和男两个值中随机
String sex = StringUtil.randomSex();
//(4) 手机以13开头+9位随机数模拟
String iphone = "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 mailbox = RandomUtil.randomLenthChar(RandomUtil.random(3, 20)) + str[RandomUtil.random(0, str.length-1)];
//(6生日要模拟18-70岁之间,即日期从1949年到2001年之间
int birthday = RandomUtil.random(1949, 2001);
User user = new User(id, name,sex, iphone, mailbox, birthday);
hashMap.put(i+"", user);
}
HashOperations<String,String,User> opsForHash = redisTemplate.opsForHash();
//获取时间
long start = System.currentTimeMillis();
//存储
opsForHash.putAll("user_hash", hashMap);
//获取时间
long end = System.currentTimeMillis();
//获取大小
Long size = opsForHash.size("user_hash");
System.out.println("系列化方式为Hash存储,保存数量为"+size+"所耗时间:"+(end-start));
}