天天看点

【redis】redis使用前后性能对比

 在上一篇博客中,我们已经完成了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】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左右。

【redis】redis使用前后性能对比

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缓存数据的同步,也是一个问题?网上有很多解决方案,下篇继续探讨。

继续阅读