1. 程式人生 > >Redis實現分頁查詢

Redis實現分頁查詢

 在我們開發專案的過程中,經常會對資料做分頁展示,如果每次請求都去查詢資料庫,當訪問量增大時,勢必會加重資料庫的負載,降低資料庫效能。然而,有些資料的是極少變動的,或者說變動的頻率不是很高,這時如果將這些資料進行快取,不僅可以提高程式效能,還能降低資料庫的負載。下面就給出高併發下的分頁資料快取方案。

一、需要了解的一些知識點

1、redis的hmset(key, value)方法,將key值設定為value,value是map型別的資料結構

2、redis的hgetAll(key)方法,獲取key的值,改值的型別為map型別的

3、關鍵字synchronized

4、key值包含的一些關鍵資訊,字首+當前的頁數+每頁資料的大小等

二、程式碼實現

          

 
  1. /* (non-Javadoc)

  2. * 預設為60秒重新整理一次;採用加鎖模式應對高併發

  3. */

  4. @Override

  5. public Page<StrategySummary> getAdvisorStrategys(AdvisorCondition condition) throws IOException{

  6. Pageable pageable=condition.getPage();

  7. int currentPage = pageable.getPageNumber();

  8. int pageSize = pageable.getPageSize();

  9. Map<String,String> result=RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);

  10. if (result!=null&&result.size()>0) {

  11. List<StrategySummary> dataList=JsonUtils.toJavaBeanList(result.get("data"), new TypeReference<List<StrategySummary>>() {});

  12. long total=Long.valueOf(result.get("total"));

  13. return new PageImplBean<StrategySummary>(dataList, pageable, total);

  14. } else {

  15. Page<StrategySummary> page=null;

  16. synchronized (MobileAppServiceImpl.class) { //當首個執行緒將資料快取後,後面的執行緒需再次檢查,防止重複查詢資料庫和快取資料

  17. int count = 0;

  18. for (int i = 0; i < 3; i++) { //取3次,防止獲取失敗

  19. Map<String,String> map =RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);

  20. if (map==null||map.size()==0) {

  21. continue;

  22. }

  23. if (map!=null&&map.size()>0) {

  24. count++;

  25. break;

  26. }

  27. }

  28. if (count==0) {

  29. page= mobileAppDao.getAdvisorStrategys(condition);

  30. List<StrategySummary> dataList=page.getContent();

  31. long total=page.getTotalElements();

  32. if(dataList.size()>0){

  33. Map<String, String> map=new HashMap<String,String>();

  34. map.put("data", JsonUtils.toJsonString(dataList));

  35. map.put("total", String.valueOf(total));

  36. RedisUtil.setMapWithExpire("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, map, MARKET);

  37. }

  38. }else{

  39. Map<String,String> map =RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);

  40. List<StrategySummary> dataList=JsonUtils.toJavaBeanList(map.get("data"), new TypeReference<List<StrategySummary>>() {});

  41. long total=Long.valueOf(map.get("total"));

  42. page= new PageImplBean<StrategySummary>(dataList, pageable, total);

  43. }

  44. }

  45. return page;

  46. }

  47.  
  48. }