在上一篇博客中,我们已经完成了redis在spring 的配置,经过测试,测试完成基本的增删该查的操作。接下来,我们尝试把redis放在具体的系统业务逻辑中,对比一下,使用了redis和不使用redis的性能对比。
一、添加到业务中
1.业务场景
我使用的OA系统的岗位管理模块,用在查询岗位页面。实现思路,第一,调用查询方法时候,先去redis中查询,是否有数据;第二,如果有数据,从redis中读取数据;第三,如果redis缓存中没有数据,再从myslq数据库中查询数据,并且将查询到的数据存入到缓存中。
2.实现代码
/**
* 查询岗位信息,添加Redis缓存
*/
public List<Role> findAll() {
String key="roleKeyTest6";
//1.添加缓存,查询数据之前先查询缓存,如果有直接返回
try{
//从Redis中获取缓存数据 String
String json=jedisClient.get(key);
if(!StringUtils.isBlank(json)){
// 把Jeson转化为list
List<Role> list=jsonUtils.jsonToList(json, Role.class);
System.out.print(list.size());
return list;
}
}
catch(Exception e){
e.printStackTrace();
}
//2.从MySQL数据库查询数据
List<Role> roleList=null;
roleList=roleDao.findAll();
//3.返回结果前,向缓存中添加数据
try{
jedisClient.set(key, jsonUtils.objectToJson(roleList));
}
catch(Exception e){
e.printStackTrace();
}
System.out.print(roleList.size());
return roleList;
}
3.添加redis存储格式如下
二、redis和MySQL性能测试
都说redis比较快,那么对于同样的数据,到底快多少呢?小编今天就测试了一下。
1.测试方法
首先在MySQL数据库中单表存储9000多条数据,首先测试直接从MySQL中取,打印出来方法执行时间;其次,测试从redis中取数据,打印执行时间;再次,每次测试都要清理缓存,每个方法测试10次,取平均值;最后,对比所用时间的长短。
2.测试数据从MySQL中取
//从mysql数据库获取数据
public List<Role> findAll() {
// 1.获取执行前时间
long startTime = System.currentTimeMillis();
// 添加缓存,查询数据之前先查询缓存,如果有直接返回
List<Role> list = roleDao.findAll();
// 2.获取方法执行后时间
long endTime = System.currentTimeMillis();
// 3.打印计算方法执时间
System.out.println("Mysql程序运行时间为:" + (endTime - startTime) + "ms");
// 打印查询数据条数
System.out.println(list.size());
return list;
}
测试10次左右,平均时间大约55ms左右。
3.测试从redis中直接获取数据
/**
* (从redis中获取数据)列表
*/
@Autowired
private JedisClient jedisClient;
@SuppressWarnings("null")
public List<Role> findAll() {
String key="roleKeyTest6";
List<Role> list=null;
//1.获取执行前时间
long startTime=System.currentTimeMillis();
//添加缓存,查询数据之前先查询缓存,如果有直接返回
try{
//从Redis中获取缓存数据
String json=jedisClient.get(key);
if(!StringUtils.isBlank(json)){
//把Jeson转化为list
list=jsonUtils.jsonToList(json, Role.class);
}
}
catch(Exception e){
e.printStackTrace();
}
//2.获取方法执行后时间
long endTime=System.currentTimeMillis();
//3.打印计算方法执时间
System.out.println("程序运行时间为:"+(endTime-startTime)+"ms");
System.out.println(list.size()+"Redis");
return list;
}
运行大约10次左右,运行时间大约21ms
91549154Redis
程序运行时间为:20ms
91549154Redis
程序运行时间为:22ms
91549154Redis
程序运行时间为:22ms
91549154Redis
程序运行时间为:22ms
91549154Redis
程序运行时间为:21ms
9154Redis
程序运行时间为:19ms
9154Redis
程序运行时间为:18ms
9154Redis
程序运行时间为:19ms
9154Redis
程序运行时间为:16ms
9154Redis
程序运行时间为:14ms
9154Redis
程序运行时间为:19ms
9154Redis
程序运行时间为:18ms
4.对比
通过以上的对比,运行时间上还是有差别的,redis查询效率比较高,大约是MySql的3倍左右。而且另一个方面,我MySQL数据库虽然数量有9000多条,但是执行的是单表查询。如果是多表联合查询,MySQL花费的时间还要长。
总结:
通过对比测试,也更加明白了为什么要使用redis。但是在测试的过程中,发现我如果修改MySQL的数据,缓存中没有修改,就会造成数据的不同步。所以如何做到MySQL数据库和redis缓存数据的同步,也是一个问题?网上有很多解决方案,下篇继续探讨。