天天看點

【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緩存資料的同步,也是一個問題?網上有很多解決方案,下篇繼續探讨。

繼續閱讀