文档章节

一个分页的小例子(从两个数据源获取数据)

laoyao
 laoyao
发布于 2014/08/29 20:12
字数 936
阅读 37
收藏 0

需求:项目中需要从两个地方获取数据源,我使用的数据源是redis+solr,solr中保存的是以前的数据,redis中保存的是最新数据,每天有job将redis中的数据在solr中创建索引。如何从两者之中取分页数据?

设计思路:设计三个接口:

a,从redis获取数据接口:redisService

b,从solr中获取数据接口:solrService

c,提供给外部调用数据接口:dataService

我主要是想分享如何从两个数据源获取分页数据,因为从redis中可以直接根据sort(String key,SortingParams param)获取分页数据,solr中可以直接根据solr提供的方法获取分页数据,(都是可以根据开始条数和条数获取数据),很简单,我这里就单写下如何从这两者中综合获取数据,

请大家记得,redis中的数据是当天数据,可以按照一定的方式排序获取,solr中的数据为非当天数据,也可以按照一定的方式排序;

下面我写下DataService中的实现方法以及需要用到的工具类:

一、分页需要用到的工具类:

/**
 * 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中,大家看过后如果发现问题可以告诉我,不胜感激。


© 著作权归作者所有

laoyao
粉丝 7
博文 22
码字总数 28605
作品 0
芜湖
程序员
私信 提问
Datalist控件,Repeater控件如何分页?

Asp.net提供了三个功能强大的列表控件:DataGrid、DataList和Repeater控件,但其中只有DataGrid控件提供分页功能。相对DataGrid,DataList和Repeater控件具有更高的样式自定义性,所以很多时...

晨曦之光
2012/03/09
251
0
easyui-table表格客户端分页实例

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/76783083 一、前言 前一篇博客已经介绍了bootstrap-table的客户端分页,而本...

尘光掠影
2017/08/06
0
0
jeesite1.X 集成多数据源

网上看了几个例子,都是相同数据源的动态切换,如果不是同一种数据库类型,分页查询就出问题。经过研究解决问题。 jeesite.properties配置多数数据源地址,这里以mysql5.7和sqlserver2008版本...

MATT0614
2018/10/29
98
0
MySQL(七)|MySQL分库分表的那点事(小怪的Java群第一次话题讨论)

一、何谓分库分表? 把原本存储于一个库的数据分块存储到多个库(主机)上,把原本存储于一个表的数据分块存储到多个表上。 二、为什么要分库分表? 数据库中的数据量不一定是可控的,在未进...

小怪聊职场
2018/05/08
0
0
千万条数据,Stack Overflow 是如何实现快速分页的?

Stack Overflow 在分页机制中使用页码代替偏移量,页码指向基于 LIMIT 和 OFFSET 的查询。假设要对 1000 万条记录进行分页,跳到最后一页会非常慢,但 Stack Overflow 还是想办法实现了快速分...

周其
2018/05/02
3K
13

没有更多内容

加载失败,请刷新页面

加载更多

数据库物理设计要做什么

选择合适的数据管理系统。 注意: 1、事务多时选Oracle。 2、SQLserver只支持在Windows下运行。 3、开发用的语言用的.net时,使用SQL server。 2、MySQL常用存储引擎 MySQL是开源数据库,只要...

sunnycat-薛定谔的猫
13分钟前
2
0
如何快速安全的插入千万条数据

前言 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库。 思路 1.估算文件大小 因为告诉文件有千万...

ksfzhaohui
15分钟前
4
0
Could not build the precompiled application for the device.

Flutter报错:Could not build the precompiled application for the device. Xcode报错:Multiple commands produce '/Users/User/Library/Developer/Xcode/DerivedData/Runner-faibejedzvv......

RainOrz
25分钟前
3
0
UCOSII 任务调度笔记

ucosii是根据优先级进行调度的。对于任务,两种状态,就绪态和非就绪态,很多种情况下任务都会处于非就绪态,如:信号量,消息队列,邮箱,延迟,任务的挂起,调度锁等都会使程序进入非就绪态...

青春无极限
28分钟前
3
0
JS-4-if

本文转载于:专业的前端网站➼JS-4-if 流程控制结构 1 顺序结构 alert(10); alert(20); 2 分支结构(选择结构) * IF 2.1 if(条件) { 条件成立时执行的语句 } else { 条件不成立时执行的语句 ...

前端老手
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部