概括
一般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序列化后,可视化界面还是原样子