美文网首页
分页获取数据

分页获取数据

作者: 军哥ye话 | 来源:发表于2015-11-06 12:55 被阅读232次

php 版本——未经测试,仅做参考

  • 使用时,继承此类并实现对应方法

      <?php
      /**
       *
       * 适用于redis + db 的存储形式,存储数据为按一定规则排序的id列表,适用于:
       * 缓存中的key使用sorted set, 且设置过期时间而非持久化存储
       * 分页获取数据时按排序的值, 即cursor->score来获取:获取比cursor->score小【或大】的length条数据
       *
       * 使用场景如:
       * 文章按发布时间排序,按评论数排序,按点赞数排序
       *
       * User: xjyin
       * Date: 15/11/5
       * Time: 下午7:45
       */
    
      class Cursor {
    
          private $member;
    
          private $score;
      }
    
      abstract class CursorTimelineGetter {
    
          private $cursor;
    
          private $length;
    
          function _construct($cursor, $length) {
              $this->cursor = $cursor;
              $this->length = $length;
          }
    
          // 返回数据为cursor的array, 长度可能会小于$length
          abstract protected function getFromCache($cursor, $length);
    
          // 返回数据为cursor的array, 长度可能会小于$length
          abstract protected function getFromDB($cursor, $length);
    
          // 将从数据库中获取到的数据放到缓存, dbResults 为cursor 的array
          abstract protected function saveToCache($dbResults);
    
          // 将不够的数据补到缓存中,否则将会造成数据丢失
          // 在实现此方法时用zAdd(key, map)的方式,避免循环调用单个member 的zAdd
          abstract protected function patchToCache($cursor);
    
          public function exec() {
              $cacheResults = $this->getFromCache($this->cursor, $this->length);
              if(!$cacheResults) {
                  $cacheResults = array();
              }
              // 若缓存中已经获取到所有分页数据,则直接返回
              if(count($cacheResults) >= $this->length) {
                  return $cacheResults;
              }
              // 缓存中数据不全时,从数据库中获取不够的
              $lengthFromDB = $this->length - count($cacheResults);
              $cursorFromDb = null;
              // 从缓存中获取到的数据为空时,需要将cursor之前的数据从db拉到cache中,否则会丢数据
              // 只要从缓存中获取的数据非空,则不存在此情况,不需要调用patchToCache
              if (count($cacheResults) <= 0) {
                  $this->patchToCache($this->cursor);
                  $cursorFromDb = $this->cursor;
              }
              else {
                  $cursorFromDb = $cacheResults[count($cacheResults) - 1];
              }
              $dbResults = $this->getFromDB($cursorFromDb, $lengthFromDB);
              if(!$dbResults or count($dbResults) == 0) {
                  return $cacheResults;
              }
              $this->saveToCache($dbResults);
              return array_merge($cacheResults, $dbResults);
          }
      }

相关文章

  • 随笔 Java分页 以及前端angularjs 中的$uib

    Javaweb 分页主要有三个方法: 1 .前端分页。(获取所有数据) 2.Java分页。(获取所有数据)(3步:...

  • 分页获取数据

    php 版本——未经测试,仅做参考 使用时,继承此类并实现对应方法

  • 页面上拉分页效果,滚动触发事件

    1.整个页面分页拉数据 2.单个列表分页拉数据 获取窗口高度let winHeight = document.do...

  • 说说分页加载及下拉刷新

    本文主要内容 分页加载 下拉刷新 分页加载,从服务器获取数据列表,列表长度很长,不可能一次获取完成,因为一次获取数...

  • django-分页

    分页显示 步骤:获取当前页---获取总数据---获取分的总页数--每页显示的条数---构建Paganitor对象,...

  • django---分页

    分页显示 步骤:获取当前页---获取总数据---获取分的总页数--每页显示的条数---构建Paganitor对象,...

  • ES分页三种方式对比

    分页方式说明优点缺点使用场景from + size最常用的分页方式,指定分页大小和偏移量可以直接获取到需要的数据。...

  • 8. sharding-jdbc源码之结果合并总结

    阿飞Javaer,转载请注明原创出处,谢谢! 分页性能分析 性能瓶颈 查询偏移量过大的分页会导致数据库获取数据性能...

  • Android媒体数据库操作

    1.获取媒体数据所有的图片、音频、视频、文件;2.分页获取媒体数据的图片、音频、视频、文件;3.删除媒体数据的图片...

  • android获取相册列表并分页获取

    有时候需要获取到系统所有图片,但一次性获取太多了,需要分批分页获取,网上很多资料都没有说到分页,作为一个数据库达人...

网友评论

      本文标题:分页获取数据

      本文链接:https://www.haomeiwen.com/subject/yhjchttx.html