需求:項目中須要從兩個地方獲取數據源,我使用的數據源是redis+solr,solr中保存的是之前的數據,redis中保存的是最新數據,天天有job將redis中的數據在solr中建立索引。如何從二者之中取分頁數據?java
設計思路:設計三個接口:redis
a,從redis獲取數據接口:redisServiceide
b,從solr中獲取數據接口:solrService工具
c,提供給外部調用數據接口:dataServicespa
我主要是想分享如何從兩個數據源獲取分頁數據,由於從redis中能夠直接根據sort(String key,SortingParams param)獲取分頁數據,solr中能夠直接根據solr提供的方法獲取分頁數據,(都是能夠根據開始條數和條數獲取數據),很簡單,我這裏就單寫下如何從這二者中綜合獲取數據,設計
請你們記得,redis中的數據是當天數據,能夠按照必定的方式排序獲取,solr中的數據爲非當天數據,也能夠按照必定的方式排序;code
下面我寫下DataService中的實現方法以及須要用到的工具類:排序
1、分頁須要用到的工具類:索引
/** * Copyright (c) 2013-2013 All Rights Reserved. */ package org.laoyao.util; /** * * 功能描述: 翻頁相關的功能 * @version 1.0.0 date 2013-06-27 下午3:52:18 */ public class PageUtil { public static final int PAGE_SIZE = 10; public static int getPageNumber(int counts) { return (counts == 0) ? 0 : (int) (counts % PAGE_SIZE == 0 ? counts / PAGE_SIZE : (counts / PAGE_SIZE + 1)); } /** * 功能描述:經過頁號和每頁記錄數獲得開始記錄號 * @param * @return */ public static int getBeginNum(int pageNum, int pageSize) { return (pageNum - 1) * pageSize + 1; } /** * 功能描述:經過頁號和每頁記錄數獲得結束記錄號 * @param * @return */ public static int getEndNum(int pageNum, int pageSize) { return pageNum * pageSize; } }
上面是一個工具類,能夠根據數量計算分多少頁,以及取某一頁的開始和結束記錄號,下面寫主要的業務邏輯:接口
public class DataServiceImpl implements DataService { @Override public Object supplierData(int pageNum, int pageSize) { List<Object> redisObjs = null; List<Object> solrObjs = null; List<Object> result = null; // 獲取取數據的開始條數和條數 Map<String, Integer> splitPageMap = getSplitPageNumbers(pageNum, pageSize); int redisBeginNum = splitPageMap.get("redisBeginNum"); int redisCount = splitPageMap.get("redisCount"); int solrBeginNum = splitPageMap.get("solrBeginNum"); int solrCount = splitPageMap.get("solrCount"); if (redisCount != 0) { // 調用取數據接口,從redis中獲取評價數據 redisObjs = redisService.getDataFromRedis(int redisBeginNum,int redisCount); } if (solrCount != 0) { // 調用數據接口,從solr中獲取評價數據 solrObjs = solrService.getDataFromRedis(int solrBeginNum,int solrCount); } result = new ArrayList<Object>(); result.addAll(redisObjs); result.addAll(solrObjs); return result; } /** * 獲取分頁的起始條數 * * @return */ private Map<String, Integer> getSplitPageNumbers(int pageNum, int pageSize) { Map<String, Integer> splitPageMap = new HashMap<String, Integer>(); int redisBeginNum = 0; // 從redis中獲取數據的開始記錄號 int redisCount = 0; // 從redis中獲取數據的條數 int solrBeginNum = 0; // 從solr中獲取數據的開始記錄號 int solrCount = 0; // 從solr中獲取數據的條數 int count = 5; // 此處count爲符合條件的數據在redis中有多少條,我先寫死,不影響思路 int beginNum = PageUtil.getBeginNum(pageNum, pageSize) - 1; // 調用數據方須要的數據起始記錄號 int endNum = PageUtil.getEndNum(pageNum, pageSize) - 1; // 調用數據方須要的數據結束記錄號 if (beginNum > count) { // 此種狀況下,只從solr中取數據,開始條數和所取數據條數爲: solrBeginNum = beginNum - count; solrCount = pageSize; } else if (endNum < count) { // 此種狀況下只從redis中取數據 redisBeginNum = beginNum; redisCount = pageSize; } else if (beginNum <= count && endNum >= count) { // 此種狀況從solr+redis取數據 redisBeginNum = beginNum; redisCount = count - beginNum; solrBeginNum = 0; if (beginNum == count) { solrCount = pageSize; } else { solrCount = pageSize - redisCount; } } splitPageMap.put("redisBeginNum", redisBeginNum); splitPageMap.put("redisCount", redisCount); splitPageMap.put("solrBeginNum", solrBeginNum); splitPageMap.put("solrCount", solrCount); return splitPageMap; } }
主要的分頁邏輯就在方法getSplitPageNumbers中,你們看事後若是發現問題能夠告訴我,不勝感激。