当前位置: 首页 > 知识库问答 >
问题:

使用PHP的AWS DynamoDB分页

唐弘益
2023-03-14

有人知道从表中分页记录吗。实际上,我想用DynamoDb在php中创建一个分页组件。

它似乎是不可能给分页喜欢

因为Dyanmodb只提供了LIMIT子句,通过它我们可以读取一定数量的记录,并且可以通过LastEvaluatedKey处理接下来的n条记录。所以如果我想直接跳到第五页,怎么可能呢?

据我所知,我们不能在页码中显示页码。我们可以做的就是读取一定数量的记录,并提供下一个链接来检索下一个n个记录。

分页是任何Web应用程序的基本功能,如果迁移到像DynamoDb这样的云数据库,我们如何实现?

请提供您的意见和建议。谢谢

共有2个答案

张嘉
2023-03-14
匿名用户

再加上@Justinas的答案,如果需要随机访问(即跳转到任意页面),Dynamo的分页性能将非常糟糕。但是,如果只执行下一页和上一页,则可以传递LastEvaluatedKey,并将由于扫描而产生的开销保持在最低限度。

正如注释中所述,您绝对应该尽可能多地缓存结果。至少,可以缓存LastEvalue atedKey结果,以便在用户浏览结果时不需要为每个分页请求重新计算它们。这里有一个例子来说明我的意思:

假设您有一个具有如下模式的表,其中CommentID是散列键。

 CommentID | Author | Comment | ...
-----------+--------+---------+------------
    1      | Joe    | Foo     | ...
    2      | Joe    | Bar     | ...
    3      | John   | Baz     | ...
    4      | Joe    | FooBar  | ...
    5      | Jane   | BooBaz  | ...
    6      | Joesie | Blah    | ...
    7      | Johnny | Blahaha | ...

当您开始分页时,假设您每页请求3条评论,您将获得第一页结果和LastEvalue atedKey=3;然后如果您对第2页进行第二次扫描请求,使用ExclusiveStartKey=3,您将获得<要获得第3页,您需要使用LastEvalue atedKey=6进行另一次扫描。

您可以看到,在没有任何缓存的情况下,要获取第3页,您需要执行三次扫描(如果您在第3页之前还请求了第1页和第2页,则其中两次扫描会重复)。因此,我建议的优化是为每个页面存储相应的密钥。你会得到这样一张地图:

 Page | Hash-Key
------+----------
   1  |   null
   2  |     3
   3  |     6
  ..  |    ... 

当你翻阅结果时,这些值会被填写出来。现在,当用户想要第3页时,您只需扫描一次,使用6作为ExclusiveStartKey

当然,对于每个页面大小,您都需要这样一个查找表,并且只有在添加(或删除)新行之前,该表才会准确。也就是说,如果您有很多请求,那么存储分页缓存所需的额外内存将非常值得。剩下的就是根据在表中添加(或删除)新数据的频率,为分页缓存设置合理的过期时间。。

孔海超
2023-03-14

是的,你说得对,DynamoDB中没有偏移量。但仅使用LimitLastEvaluatedKey,我实现了以下功能:

public function scan($table, $filter = [], $select = null, $limit = 2)
{
    $page = isset($_GET['page']) ? $_GET['page'] : 0;
    $options = [
        'TableName' => $table,
        'Count' => true,
    ];

    if (!empty($limit)) {
        $options['Limit'] = $limit;
    }

    if (!is_null($select)) {
        $options['Select'] = $select;
    }

    if (!empty($filter)) {
        $options['ScanFilter'] = $filter;
    }

    $results = $results = $this->_client->scan($options);

    while ($page > 0 && isset($results['LastEvaluatedKey'])) {
        $results = $results = $this->_client->scan($options);
        $options['ExclusiveStartKey'] = $results['LastEvaluatedKey'];
        $page--;
    }

    return $results;
}

$this-

 类似资料:
  • 本文向大家介绍高效mongodb的php分页类(不使用skip),包括了高效mongodb的php分页类(不使用skip)的使用技巧和注意事项,需要的朋友参考一下 mongodb分页skip+limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。 如果能够通过查询条件查出每页结果的最后一条记录,在用最后一条记录作为查询条件去查下一页,这样每次都查询页面size条记录,效率不会差。

  • 问题内容: 已关闭 。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我正在寻找一个使用jQuery,PHP和MySQL的很好的Ajax分页教程。我遇到的那些不好。 因此,如果有人可以推荐一个好的网站/教程,那就太好了。谢谢。 编辑 这是一些不好的教程。 网站1 网站2 网站3 问题答案: 这是 CakePHP的 一个教程

  • 本文向大家介绍php 使用array函数实现分页,包括了php 使用array函数实现分页的使用技巧和注意事项,需要的朋友参考一下 代码很简单,就不多废话了。 以上就是使用array函数实现分页的核心代码了,希望大家能够喜欢。

  • 本文向大家介绍php数组使用规则分析,包括了php数组使用规则分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php中数组的使用规则。分享给大家供大家参考。具体分析如下: 数组在php中处于灰常重要的地位。字符串、图片、数码、视频等值都以数组的形式存在,所以了解清楚数组的各种规则十分必要。 1、键、值。 数组的基本形式: key=>value,其中,key只能是两种,integer、s

  • 问题内容: 我需要找到访问我的网站的用户屏幕的屏幕分辨率? 问题答案: 您无法使用纯PHP做到这一点。您必须使用JavaScript来完成。有几篇有关如何执行此操作的文章。 本质上,您可以设置cookie,甚至可以执行一些Ajax来将信息发送到PHP脚本。如果使用jQuery,则可以执行以下操作: jQuery: PHP(some_script.php) 所有这些实际上都是最基本的,但是它应该可以

  • 本文向大家介绍php中stdClass的用法分析,包括了php中stdClass的用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php中stdClass的用法。分享给大家供大家参考。具体分析如下: stdclass在php中是预定义的几个类之一,是zent保留的一个类。实际上它是PHP提供的一个基类,就是一个空白的类,里面什么都没有,我们可以实例化它,然后定义一系列的变量,通过它