Redis實現分頁查詢
在我們開發專案的過程中,經常會對資料做分頁展示,如果每次請求都去查詢資料庫,當訪問量增大時,勢必會加重資料庫的負載,降低資料庫效能。然而,有些資料的是極少變動的,或者說變動的頻率不是很高,這時如果將這些資料進行快取,不僅可以提高程式效能,還能降低資料庫的負載。下面就給出高併發下的分頁資料快取方案。
一、需要了解的一些知識點
1、redis的hmset(key, value)方法,將key值設定為value,value是map型別的資料結構
2、redis的hgetAll(key)方法,獲取key的值,改值的型別為map型別的
3、關鍵字synchronized
4、key值包含的一些關鍵資訊,字首+當前的頁數+每頁資料的大小等
二、程式碼實現
-
/* (non-Javadoc)
-
* 預設為60秒重新整理一次;採用加鎖模式應對高併發
-
*/
-
@Override
-
public Page<StrategySummary> getAdvisorStrategys(AdvisorCondition condition) throws IOException{
-
Pageable pageable=condition.getPage();
-
int currentPage = pageable.getPageNumber();
-
int pageSize = pageable.getPageSize();
-
Map<String,String> result=RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);
-
if (result!=null&&result.size()>0) {
-
List<StrategySummary> dataList=JsonUtils.toJavaBeanList(result.get("data"), new TypeReference<List<StrategySummary>>() {});
-
long total=Long.valueOf(result.get("total"));
-
return new PageImplBean<StrategySummary>(dataList, pageable, total);
-
} else {
-
Page<StrategySummary> page=null;
-
synchronized (MobileAppServiceImpl.class) { //當首個執行緒將資料快取後,後面的執行緒需再次檢查,防止重複查詢資料庫和快取資料
-
int count = 0;
-
for (int i = 0; i < 3; i++) { //取3次,防止獲取失敗
-
Map<String,String> map =RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);
-
if (map==null||map.size()==0) {
-
continue;
-
}
-
if (map!=null&&map.size()>0) {
-
count++;
-
break;
-
}
-
}
-
if (count==0) {
-
page= mobileAppDao.getAdvisorStrategys(condition);
-
List<StrategySummary> dataList=page.getContent();
-
long total=page.getTotalElements();
-
if(dataList.size()>0){
-
Map<String, String> map=new HashMap<String,String>();
-
map.put("data", JsonUtils.toJsonString(dataList));
-
map.put("total", String.valueOf(total));
-
RedisUtil.setMapWithExpire("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, map, MARKET);
-
}
-
}else{
-
Map<String,String> map =RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);
-
List<StrategySummary> dataList=JsonUtils.toJavaBeanList(map.get("data"), new TypeReference<List<StrategySummary>>() {});
-
long total=Long.valueOf(map.get("total"));
-
page= new PageImplBean<StrategySummary>(dataList, pageable, total);
-
}
-
}
-
return page;
-
}
-
}