一個分頁的小例子(從兩個數據源獲取數據)

需求:項目中須要從兩個地方獲取數據源,我使用的數據源是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中,你們看事後若是發現問題能夠告訴我,不勝感激。

相關文章
相關標籤/搜索