首先,创建Maven项目,还要保证自己的虚拟机、redis处于正常启动状态下!
一、配置文件
导入对应的配置文件,以及pom文件
确认项目能正常运行,需要用到的jar包都有依赖
二、创建实体类
创建自己的实体类,并实现Serializable接口
实现对应的构造方法,getter和setter方法,以及toString方法
三、创建对应的测试类
创建测试类
启动spring-redis.xml,并且创建RedisTemplate对象,并且注入该对象
四、编写测试代码
测试jdk序列化并存储
@Test
public void JDKTest() {
List<User> users=new ArrayList<User>();
//定义邮箱结尾数组
String []email= {"@qq.com","@163.com","@sian.com","@gmail.com","@sohu.com","@hotmail.com","@foxmail.com"};
//定义性别数组
String []gender= {"男","女"};
for (int i = 1; i <= 50000; i++) {
User user=new User();
//ID使用1-5万的顺序号
user.setId(i);
//姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法
user.setName(StringUtil.randomChineseString(3));
//性别在女和男两个值中随机
user.setGender(gender[RandomUtil.random(0,1)]);
//手机以13开头+9位随机数模拟
user.setPhone("13"+RandomUtil.randomNumber(9));
//邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com | @hotmail.com | @foxmail.com模拟
user.setEmail(RandomUtil.randomString(RandomUtil.random(3,20))+email[RandomUtil.random(0,6)]);
//生日要模拟18-70岁之间,即日期从1949年到2001年之间
Calendar calendar=Calendar.getInstance();
//设置初始时间
calendar.set(1949,0,1);
//设置关闭时间
Calendar calendar2=Calendar.getInstance();
calendar2.set(2001,11,31);
//格式化时间
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(""+format.format(DateUtil.randomDate(calendar.getTime(),calendar2.getTime())));
users.add(user);
}
ListOperations opsForList = redisTemplate.opsForList();
//设置存储启动时间
Long long1=System.currentTimeMillis();
//开始存储
opsForList.leftPushAll("user_jdk",users);
//设置存数结束时间
Long long2=System.currentTimeMillis();
//输出结果
System.out.println("序列化方式:jdk,保存数量:"+users.size()+",所耗时间:"+(long2-long1));
}
测试json序列化并存储
@Test
public void JSONTest() {
List<User> users=new ArrayList<User>();
String []email= {"@qq.com","@163.com","@sian.com","@gmail.com","@sohu.com","@hotmail.com","@foxmail.com"};
String []gender= {"男","女"};
for (int i = 1; i <= 50000; i++) {
User user=new User();
//ID使用1-5万的顺序号
user.setId(i);
//姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法
user.setName(StringUtil.randomChineseString(3));
//性别在女和男两个值中随机
user.setGender(gender[RandomUtil.random(0,1)]);
//手机以13开头+9位随机数模拟
user.setPhone("13"+RandomUtil.randomNumber(9));
//邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com | @hotmail.com | @foxmail.com模拟
user.setEmail(RandomUtil.randomString(RandomUtil.random(3,20))+email[RandomUtil.random(0,6)]);
//生日要模拟18-70岁之间,即日期从1949年到2001年之间
Calendar calendar=Calendar.getInstance();
calendar.set(1949,0,1);
Calendar calendar2=Calendar.getInstance();
calendar2.set(2001,11,31);
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(""+format.format(DateUtil.randomDate(calendar.getTime(),calendar2.getTime())));
users.add(user);
}
ListOperations opsForList = redisTemplate.opsForList();
Long long1=System.currentTimeMillis();
opsForList.leftPushAll("user_json",users);
Long long2=System.currentTimeMillis();
System.out.println("序列化方式:json,保存数量:"+users.size()+",所耗时间:"+(long2-long1));
}
测试hash序列化并存储
@Test
public void HashTest() {
Map<String,User> map=new HashMap<String, User>();
String []email= {"@qq.com","@163.com","@sian.com","@gmail.com","@sohu.com","@hotmail.com","@foxmail.com"};
String []gender= {"男","女"};
for (int i = 1; i <= 50000; i++) {
User user=new User();
//ID使用1-5万的顺序号
user.setId(i);
//姓名使用3个随机汉字模拟,可以使用以前自己编写的工具方法
user.setName(StringUtil.randomChineseString(3));
//性别在女和男两个值中随机
user.setGender(gender[RandomUtil.random(0,1)]);
//手机以13开头+9位随机数模拟
user.setPhone("13"+RandomUtil.randomNumber(9));
//邮箱以3-20个随机字母 + @qq.com | @163.com | @sian.com | @gmail.com | @sohu.com | @hotmail.com | @foxmail.com模拟
user.setEmail(RandomUtil.randomString(RandomUtil.random(3,20))+email[RandomUtil.random(0,6)]);
//生日要模拟18-70岁之间,即日期从1949年到2001年之间
Calendar calendar=Calendar.getInstance();
calendar.set(1949,0,1);
Calendar calendar2=Calendar.getInstance();
calendar2.set(2001,11,31);
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(""+format.format(DateUtil.randomDate(calendar.getTime(),calendar2.getTime())));
map.put("user"+i,user);
}
HashOperations opsForHash = redisTemplate.opsForHash();
Long long1=System.currentTimeMillis();
opsForHash.putAll("user_hash",map);
Long long2=System.currentTimeMillis();
System.out.println("序列化方式:hash_jdk,保存数量:"+map.size()+",所耗时间:"+(long2-long1));
}
五、代码测试
1、修改配置文件
配置文件如下
<?xml version="1.0" encoding="UTF-8"?><!-- 第1步:加载配置文件 -->
<context:property-placeholder location="classpath:redis.properties"/>
<!-- 配置redis的操作 -->
<!-- redis连接池 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxActive}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<!-- 连接池配置,类似数据库连接工厂-->
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<!-- <property name="password" value="${redis.pass}"></property> -->
<property name="poolConfig" ref="poolConfig"/>
</bean>
<!--redis操作模版,使用该对象可以操作redis -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
<property name="connectionFactory" ref="jedisConnectionFactory" />
<!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!! -->
<property name="keySerializer" >
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<!-- <property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property> -->
<property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
<!--开启事务 -->
<property name="enableTransactionSupport" value="true"/>
</bean >
2、修改序列化方式
依次启用图中两种序列化方式、hash的不用修改。
3、运行代码
注意:存储数量相同,才有对比性。
查询jdk存储的个别数据
查询json存储的个别数据
查询hash存储的个别数据
总结、
使用jdk序列化所需时间较长,数据加密比较好,比较安全.
使用json序列化用时较短,但是加密方式容易被破解,比较不安全。
使用hash序列化,用时一般,加密也很棒,比较安全。
建议使用hash_jdk存储!
需要具体项目
有些详情看不懂的可以去github,看具体代码
github链接:
https://github.com/xiaochuang2019/xiaochuang-redis-test.git