在上一篇部落格中,我們已經完成了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緩存資料的同步,也是一個問題?網上有很多解決方案,下篇繼續探讨。