首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用PHP实现AWS DynamoDB分页

用PHP实现AWS DynamoDB分页
EN

Stack Overflow用户
提问于 2014-05-03 11:13:47
回答 2查看 5.7K关注 0票数 6

有人知道如何把记录从桌子上拿出来吗?实际上,我想用DynamoDb在php中创建分页组件。

似乎不可能像1,2,3,4,5.。

因为Dyanmodb只是给我们提供了限制条款,通过它我们可以读到特定的no。,我们可以通过LastEvaluatedKey处理下一个n个记录。所以如果我想直接跳到第5页,怎么可能呢?

根据我的理解,我们不能在分页中显示页码。我们可以做的就是读取某些限制的记录,并提供下一个链接来检索下一个n个记录。

分页是任何web应用程序的基本特性,如果迁移到云数据库(如DynamoDb ),我们如何实现?

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

EN

回答 2

Stack Overflow用户

发布于 2014-08-29 12:04:42

是的,你是对的,在OFFSET中没有DynamoDB。但是,仅使用LimitLastEvaluatedKey,我创建了以下函数:

代码语言:javascript
复制
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->_client是指DynamoDb客户端对象。

基本上,我用LastEvaluatedKey循环所有条目,直到到达需要的页面。

要获取表中的总条目,请调用$this->scan($this->tableName(), [], null, null)['Count']; (即--不需要任何搜索条件,也不需要分页,就像在普通分页函数中一样)。

票数 2
EN

Stack Overflow用户

发布于 2015-08-21 05:55:07

添加到@Justinas的答案中,如果随机访问,迪纳摩将有相当糟糕的分页性能(即。跳转到任意页面)是需要的。但是,如果只执行下一页和上一页,则可以传递LastEvaluatedKey并将扫描所造成的开销降到最低。

正如注释中所述,您应该尽可能多地缓存结果。至少,可以缓存LastEvaluatedKey结果,以便在用户分页查看结果时不需要重新计算每个分页请求。下面是我的一个例子:

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

代码语言:javascript
复制
 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个注释,您将得到第一个页面结果和LastEvaluatedKey = 3;然后,如果您对第2页发出第二次扫描请求,则使用ExclusiveStartKey=3获得LastEvaluatedKey = 6;要获得第3页,您将使用LastEvaluatedKey = 6进行另一次扫描。诸若此类。

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

代码语言:javascript
复制
 Page | Hash-Key
------+----------
   1  |   null
   2  |     3
   3  |     6
  ..  |    ... 

当你浏览结果时,这些值就会被填上。现在,当用户想要第3页时,只需进行一次扫描,使用6作为ExclusiveStartKey

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23443683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档